從“txt A”中搜尋數字並替換為 csv 文件

從“txt A”中搜尋數字並替換為 csv 文件

我已經嘗試了很多方法,但仍然無法達到我想要的效果。抱歉我還在學習。

我想要的是這樣的:

文件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讀取的行數。NRFNR


如果我僅更改第一個字段,則逗號將“消失”,$1 = "//" $1因為這將使用當前值OFS(預設為空格)重新形成記錄。您可以透過使用 來防止這種情況BEGIN { OFS=FS },它將設定OFS為逗號字元(或您-F在命令列上使用的任何字元)。

相關內容