我有一個.csv文件,格式如下。 id|name|date
AWK - 替換選定列銷燬值的輸出格式
我正在使用下面的Awk命令來更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存輸出,但格式被破壞。
我想要什麼:100|James|2015
我能得到什麼:100 James 2015
如何避免第二個,並獲得第一個?
我有一個.csv文件,格式如下。 id|name|date
AWK - 替換選定列銷燬值的輸出格式
我正在使用下面的Awk命令來更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
我想保存輸出,但格式被破壞。
我想要什麼:100|James|2015
我能得到什麼:100 James 2015
如何避免第二個,並獲得第一個?
你可以設置OFS中,輸出字段分隔符像在本例中:
awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv
-v OFS=\|
分配OFS
變量的值|
。它是BEGIN { OFS = "|" }
區塊的替代方案。|
需要被shell保護,因爲shell級別的含義是將一個命令的管道輸出到另一個命令的輸入中。使用"|"
或\|
是兩種方法。不要讓shell變量擴大成爲一個awk腳本的身體的一部分:因爲它可能讓你到給出的shell變量的各種值陰險錯誤
awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv
。而不是從shell變量填充awk中的變量並在腳本中使用awk的變量:
awk -F "|" -v col="$col" -v val="$val" '{$col=val}1' filename.csv
WRT您的具體問題,但是,AWK當值分配給現場重建的記錄,所以你需要的OFS有與FS相同的值:
awk -v col="$col" -v val="$val" 'BEGIN{FS=OFS="|"} {$col=val}1' filename.csv
不客氣。如果您打算在UNIX上進行更多的文本操作,我強烈推薦Arnold Robbins編寫的「Effective Awk Programming,4th Edition」一書。 –
工作非常好,非常感謝。小心解釋「|」之間的區別和'\' ?還有'-v'? – Alkiviadis95