我有幾個資料集包含純文本格式的 x、y、z 坐標(無列標題、空格分隔、crlf 換行符)。資料如下所示:
10168522 21059480 -86
10169988 21058886 -86
10171457 21058291 -86
10172926 21057706 -86
10174428 21057114 -85
10175927 21056531 -85
10177434 21055952 -85
10178966 21055370 -84
10180473 21054773 -85
10181992 21054164 -85
10183517 21053557 -85
在此示例中,檔案名為“fileA.xyz”。我想將行號和檔案名添加到檔案中并使用 awk 列印出來(實際上是 gawk 4.0.2,沒有升級/安裝其他工具的選項)。我想出了以下內容
awk -F ' ' -v OFS=' ' -v ORS=' ' '{$1; $2; $3; $(NF 1)= i FS "fileA.xyz"}1' better_fileA.xyz
哪種有效,但第一行保持不變:
10168522 21059480 -86
1 fileA.xyz 10169988 21058886 -86
2 fileA.xyz 10171457 21058291 -86
3 fileA.xyz 10172926 21057706 -86
4 fileA.xyz 10174428 21057114 -85
5 fileA.xyz 10175927 21056531 -85
6 fileA.xyz 10177434 21055952 -85
7 fileA.xyz 10178966 21055370 -84
8 fileA.xyz 10180473 21054773 -85
9 fileA.xyz 10181992 21054164 -85
10 fileA.xyz 10183517 21053557 -85
我還注意到行號(第一列)前面有一個額外的空格。我確實理解 awk 非常復雜,但我在語法選項中有點迷失。對于初學者,我想知道為什么我提供的列的順序顯然沒有傳遞到輸出?
由于所有檔案都非常大(幾場演出),我想使用 awk / sed。另請注意,檔案需要保持一致,因此涉及的解決方案cat -n并不是一個真正的選擇(由于檔案中行號的填充,這在這種情況下是不合理的,其中行號范圍是先驗未知的,并且還因為這不會處理檔案名)。
非常歡迎任何有關解決方案的建議或指示!
uj5u.com熱心網友回復:
如果檔案名是硬編碼的,那么這個簡短的單行應該會有所幫助:
$ awk '$0=NR FS "fileA.xyz" FS $0' YourFile
基本上,它會將內容(lineNo# 和檔案名)添加到每條記錄中,然后列印到 stdOut。
uj5u.com熱心網友回復:
$ awk '{printf "= %s %s\n", NR, "fileA.xyz", $0}' better_fileA.xyz
1 fileA.xyz 10168522 21059480 -86
2 fileA.xyz 10169988 21058886 -86
3 fileA.xyz 10171457 21058291 -86
4 fileA.xyz 10172926 21057706 -86
5 fileA.xyz 10174428 21057114 -85
6 fileA.xyz 10175927 21056531 -85
7 fileA.xyz 10177434 21055952 -85
8 fileA.xyz 10178966 21055370 -84
9 fileA.xyz 10180473 21054773 -85
10 fileA.xyz 10181992 21054164 -85
11 fileA.xyz 10183517 21053557 -85
uj5u.com熱心網友回復:
您的輸入中的第一行似乎被跳過(但不是真的),因為您的輸入檔案有 DOS 行結尾 ( <CR><LF>) 所以這些CRs導致您添加到 1 行的文本出現在下一行的開頭而不是在當前行的末尾。請參閱為什么我的工具輸出會覆寫自身以及如何修復它?.
關于你的腳本:
-F ' ' -v OFS=' '沒有意義,因為您將它們設定為它們已有的默認值。-v ORS=' '沒有意義,因為您不希望您的輸出全部塞滿 1 行。$1; $2; $3;沒有意義,因為它除了無緣無故地參考該欄位之外什么都不做。$(NF 1)= i沒有意義,因為i將始終具有NR.- 填充/修改欄位(例如
$(NF 1))或$0不必要地是低效的,因為它會導致 awk 重新構造和/或重新拆分$0。
從您的代碼(試圖追加欄位)和當前輸出(顯示您似乎滿意的前置欄位)中也不清楚您真正想要做什么 - 追加或前置欄位。還要澄清"fileA.xyz"您是否添加到輸出可以從輸入檔案名派生better_fileA.xyz
您可能想要的一種猜測是:
$ awk '{sub(/\r$/,"")} {print $0, NR, "fileA.xyz"}' better_fileA.xyz
10168522 21059480 -86 1 fileA.xyz
10169988 21058886 -86 2 fileA.xyz
10171457 21058291 -86 3 fileA.xyz
10172926 21057706 -86 4 fileA.xyz
10174428 21057114 -85 5 fileA.xyz
10175927 21056531 -85 6 fileA.xyz
10177434 21055952 -85 7 fileA.xyz
10178966 21055370 -84 8 fileA.xyz
10180473 21054773 -85 9 fileA.xyz
10181992 21054164 -85 10 fileA.xyz
10183517 21053557 -85 11 fileA.xyz
或者可能:
$ awk '{sub(/\r$/,"")} NR==1{fname=FILENAME; sub(/[^_]*_/,"",fname)} {print $0, NR, fname}' better_fileA.xyz
10168522 21059480 -86 1 fileA.xyz
10169988 21058886 -86 2 fileA.xyz
10171457 21058291 -86 3 fileA.xyz
10172926 21057706 -86 4 fileA.xyz
10174428 21057114 -85 5 fileA.xyz
10175927 21056531 -85 6 fileA.xyz
10177434 21055952 -85 7 fileA.xyz
10178966 21055370 -84 8 fileA.xyz
10180473 21054773 -85 9 fileA.xyz
10181992 21054164 -85 10 fileA.xyz
10183517 21053557 -85 11 fileA.xyz
或者可能:
$ awk '{sub(/\r$/,"")} NR==1{fname=FILENAME; sub(/[^_]*_/,"",fname)} {print NR, fname, $0}' better_fileA.xyz
1 fileA.xyz 10168522 21059480 -86
2 fileA.xyz 10169988 21058886 -86
3 fileA.xyz 10171457 21058291 -86
4 fileA.xyz 10172926 21057706 -86
5 fileA.xyz 10174428 21057114 -85
6 fileA.xyz 10175927 21056531 -85
7 fileA.xyz 10177434 21055952 -85
8 fileA.xyz 10178966 21055370 -84
9 fileA.xyz 10180473 21054773 -85
10 fileA.xyz 10181992 21054164 -85
11 fileA.xyz 10183517 21053557 -85
獲取 Arnold Robbins 所著的《Effective AWK Programming, 5th Edition》一書。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/494580.html
下一篇:從CSV中的行中洗掉非整數
