Shell-Script

特定列級替換

  • May 27, 2015

如果我有一個包含列條目的文件,是否可以僅替換特定列中的特定條目並將更改保存到同一個文件?

範例文件abc.txt

SR|FRUITS|COLOR|
1|Apple|Red|
2|Mango|Yellow|
3|Orange|Orange|
4|W.Melon|Green|

需要將Orange從 fruits 更改為Orange_Edit。但是顏色中的橙色不應該受到影響。

你可以用awklike分兩步完成

awk '{$2="VAL";print}' input_file > temp_file
mv temp_file input_file

這將在空白處拆分輸入文件,替換第二列中的值(對不同的列使用除 2 之外的任何其他數字),因此它現在將是“VAL”。除非您使用OFS輸出欄位分隔符更改它,否則它將是一個空格。如果您想要其他內容,可以在引號內添加類似 ‘BEGIN {OFS="\t"}…’ 的內容,以將輸出欄位分隔符設置為您想要的任何內容。

如果您希望這些值不是常量,您將需要做更多的工作,但您可以調整它來做到這一點。

要使這項工作適用於您的情況,您可以執行以下操作:

awk -F\| 'BEGIN {OFS="|";} $2~/^Orange$/ {$2="Orange_edit";} {print}' abc.txt > temp_file
mv temp_file abc.txt

這首先告訴通過傳遞awk來拆分欄位。然後,我們將輸出設置為也用於輸出分隔符(預設為空格),方法是製作第一個程式碼塊(匹配 BEGIN 的部分,匹配執行開始的關鍵字)並設置我們的, 或輸出欄位分隔符. 正如 Otheus 指出的那樣,我們可以將輸出分隔符設置為與輸入分隔符相同。|``-F\|``|``awk``OFS``{OFS=FS}

之後,我們開始查看線條。我們比較由 引用的第二個欄位,$2然後使用 來檢查它是否與正則表達式匹配~。After~是我們要匹配的正則表達式,^這裡的意思是匹配欄位的開頭,然後我們有字元串“Orange”,然後$匹配欄位的結尾。由於這是一個硬編碼字元串,Otheus 也正確地觀察到,我們可以在這裡測試字元串相等性,$2=="Orange"然後跳過正則表達式處理,因為這次它實際上並沒有做任何事情。如果該匹配在{}執行後成功執行程式碼塊,則會將新值保存到第二個欄位中。

最後,我們為每一行執行最後一段程式碼{print},但是當上面的“橙色”匹配成功時,我們更改了第二個欄位的值,因此它使用我們的新值而不是舊值列印。

awk通常會列印到螢幕上(顯然較新gawk的有一個選項來簡化這部分)所以我們將它保存到一個文件中,然後將該文件移回原始名稱。

引用自:https://unix.stackexchange.com/questions/205880