特定列級替換
如果我有一個包含列條目的文件,是否可以僅替換特定列中的特定條目並將更改保存到同一個文件?
範例文件
abc.txt
:SR|FRUITS|COLOR| 1|Apple|Red| 2|Mango|Yellow| 3|Orange|Orange| 4|W.Melon|Green|
需要將Orange從 fruits 更改為Orange_Edit。但是顏色中的橙色不應該受到影響。
你可以用
awk
like分兩步完成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
的有一個選項來簡化這部分)所以我們將它保存到一個文件中,然後將該文件移回原始名稱。