我已經嘗試了很多方法,但仍然無法達到我想要的效果。抱歉我還在學習。
我想要的是這樣的:
文件A.txt
5844
6069
6303
6309
文件B.txt
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,
我想更改 A.txt 中搜尋到的數字並註解掉 B.txt 中的行。有時搜尋到的數字可能會出現在另一列中,因此只會變更第一列。
結果:
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,
我嘗試過,有時它會變得混亂並且也更改了其他列。然後我就用了這樣的東西,很長而且不好修改,
awk -F ',' '/^5844/ && $1="5844"{$1="//5844"}1' b.txt > c.txt; cp c.txt ba.txt; rm -rf b.txt; mv ba.txt b.txt
有時也會刪除“,”分隔符號。
請幫忙,非常感謝。
答案1
$ awk -F , 'FNR==NR { data[$1]=1; next } $1 in data { $0 = "//" $0 }; 1' 'File A.txt' 'File B.txt'
500,5,4,8,,,
5535,5,4,6069,,,
2121,5,4,8,,,
//5844,5,4,5844,,,
//6069,5,4,8,,,
File A.txt
我在這裡所做的是首先從關聯數組中的鍵中讀取數字data
。然後,我測試每個第一個字段,File B.txt
看看它是否是關鍵字段data
。如果是,我會新增//
到目前行的前面。然後列印所有行,無論是否修改。
僅當從命令行上的第一個文件讀取時,測試FNR==NR
才會為真,並且該區塊以next
.這意味著,如果第一個欄位是數組中的鍵,則僅對第一個檔案執行第一個區塊,而對第二個檔案執行第二個區塊data
。
最後1
的 觸發輸出,可以用 代替{ print }
。
以上只會添加 //
到第二個文件中與第一個文件中的數字相符的行。至也消除 //
從行不是匹配(即處理您更新的問題):
$ cat 'File B.txt'
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,
$ awk -F , 'FNR==NR { data[$1]=1; next } FNR > 2 { if ($1 in data) $0 = "//" $0; else sub("^//","") }; 1' 'File A.txt' 'File B.txt'
// some comment
// some explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,
該awk
命令假設您希望不File B.txt
更改地通過前兩行(這是FNR > 2
測試所負責的)。該FNR > 2
區塊測試該數字是否為關鍵輸入data
,如果是,則該行被註解掉,但如果不是,則//
使用 刪除該行開頭的任何內容sub()
。
FNR > 2
您可以使用/^\/\/ /
測試文件頂部的註釋來代替。這將要求所有此類註釋始終//
以空格開頭。
特殊變數NR
和保存到目前為止總共 ( ) 和目前檔案 ( ) 中FNR
讀取的行數。NR
FNR
如果我僅更改第一個字段,則逗號將“消失”,$1 = "//" $1
因為這將使用當前值OFS
(預設為空格)重新形成記錄。您可以透過使用 來防止這種情況BEGIN { OFS=FS }
,它將設定OFS
為逗號字元(或您-F
在命令列上使用的任何字元)。