2017-08-01 144 views
0

我正在處理一個需要我編輯csv文件的特定列和行的項目。我已經成功找到正確的行,獲取行號,甚至將特定的列更新爲標準輸出,但不是.csv文件。我遇到的問題是把它放在一起,並讓sed更新文件中的值。sed編輯csv文件中的特定列和行

這裏是在CSV值的一個例子:

9847,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA 
9848,132,3132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA 
9849,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9850,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9851,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9852,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9853,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9854,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9855,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 
9856,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,No,pw,Yes,SA 
9857,3132,132,0,168,0,410,73,4400,DC,4300,6,248,Yes,Yes,Yes,Yes,Yes,No,No,No,No,No,LSI,Service,Yes,No,Yes,pw,Yes,SA 

在這個例子中,我想修改的項目編號9856的第28列是。到目前爲止,我的成功命令包括:​​

此命令爲我如何顯示該行提供了正確的返回值。

grep 9856 ./file.csv | awk -F, '$28="Yes"' 

在這裏,我想我需要管的結果,一個sed命令,將替換更新的行現有的線,但我所有的嘗試都沒有成功!

此外,如果你可以請詳細說明你的答案爲我的學習目的。我也將在這個項目中編輯許多其他列值。

+1

'的awk「BEGIN {FS = OFS =」, 「} $ 1 ==」 9856" {$ 28 = 「是」} 1'文件'? – Cyrus

+0

賽勒斯,這個命令是否會更新現有的file.csv? – Konan

+0

這不會更新文件。 – Cyrus

回答

2

隨着GNU sed的:

sed '/^9856,/s/[^,]*/Yes/28' file.csv 

說明

  • /^9856,/:如果符合^9856,
  • s/[^,]*/Yes/28開始:替換包含零個或多個(*)串的第28發生非逗號字符([^,]*Yes

編輯到位文件中​​添加-i標誌:

sed -i '/^9856,/s/[^,]*/Yes/28' file.csv 
+1

這正是我需要的!你介意簡要描述命令的語法。它看起來並不複雜,但我也想從中學習。 – Konan

+0

我編輯精心製作。 – SLePort

0

你可以使用一個完整的awk的解決方案

awk -F, '$1 == "9856" { for (i=1;i<=25,i++) { printf "%s,",$i } printf "%s,","Yes";for (i=27;i<=NF-1;i++) { printf "%s,",$i } printf "%s",$NF }' filename 

檢查第一,分隔字段等於9856,然後打印前25名逗號分隔的字段,然後,再接着「是」田野27到最後一場,但一場。然後我們最後打印最後一個沒有逗號的字段。

+0

這個awk命令會不會更新原始的file.csv文件?它似乎在編輯字符串,但沒有更新文件。 – Konan

+0

您將需要將輸出重定向到另一個文件。 –