我一直在處理一個 csv 檔案。
我只想替換第 3 列和第 4 列。
下面是一個例子:
Col1 Col2 Col3 Col4 Col5 Col6 Col7
c1 f2 stack.overflow stack.overflow f5 stack.overflow stack.overflow
d1 g2 stack2.overflow2 stack2.overflow2 xyx stack2.overflow2 stack2.overflow2
我只執行 Col3 和 Col4 的搜索和替換。
我得到的是:
Col1 Col2 Col3 Col4 Col5 Col6 Col7
c1 f2 macy.greytold macy.greytold f5 stack.overflow stack.overflow
d1 g2 prince.caballero prince.caballero xyx stack2.overflow2 stack2.overflow2
我用過 sed:
sed ' s!stack.overflow2!prince.caballero!g' filename.csv > test1.csv
sed ' s!stack.overflow!macy.greytold!g' test1.csv > test-2.csv
但這改變了一切。有沒有辦法只更改欄位 3 和 4?
請注意,我已經給出了 2 行的示例。這可以運行到 100 行。
uj5u.com熱心網友回復:
假設您的檔案是 TSV 檔案(制表符分隔值),這對 Awk 來說很容易。
awk -F '\t' '$3 == "stack.overflow2" { $3 = "prince.caballero" }
$4 == "stack.overflow2" { $4 = "prince.caballero" }
$3 == "stack.overflow" { $3 = "macy.greytold" }
$4 == "stack.overflow" { $4 = "macy.greytold" }
1' filename.csv >updated.tsv
awk 一次處理一行(或者更一般地說,一個記錄;您可以使用 更改記錄分隔符RS=value)。變數$1,$2等拿到就行了各個欄位的值。在==比較簡單的檢查逐字平等(請,如果你想匹配這些欄位,或者如不區分大小寫匹配的子串更新的問題),并最終1說來列印每行。
在一般情況下,CSV 及其變體允許參考欄位,這意味著并非所有記錄都是一行,并且并非所有欄位分隔符實際上都將兩個欄位分開,此時使用簡單的面向行的工具(如 Awk)可能不再可行. 如果遇到這些復雜情況,請尋找專用的 CSV 處理工具,或切換到帶有適當 CSV 決議器的語言——Python 是一種流行的選擇。
uj5u.com熱心網友回復:
您使用全域g標志,這意味著替換所有匹配項。您可以通過定位sed ' s!stack.overflow2!prince.caballero!2'第二個等的出現來過濾它。
您也可以簡單地為每場比賽進行兩次替換。
使用 sed
$ sed 's/stack.overflow/macy.greytold/;s/stack.overflow/macy.greytold/;s/stack2.overflow2/prince.caballero/;s/stack2.overflow2/prince.caballero/' input_file
Col1 Col2 Col3 Col4 Col5 Col6 Col7
c1 f2 macy.greytold macy.greytold f5 stack.overflow stack.overflow
d1 g2 prince.caballero prince.caballero xyx stack2.overflow2 stack2.overflow2
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/372727.html
