2016-03-20 25 views
0

我有一個.csv文件,格式如下。 id|name|dateAWK - 替換選定列銷燬值的輸出格式

我正在使用下面的Awk命令來更改一行中的特定列,它的工作原理。 awk -F "|" '{$"'"$col"'"="'"$val"'";}1' filename.csv

我想保存輸出,但格式被破壞。

我想要什麼:100|James|2015

我能得到什麼:100 James 2015

如何避免第二個,並獲得第一個?

回答

3

你可以設置OFS中,輸出字段分隔符像在本例中:

awk -F\| -v OFS=\| '{print $1, $2, $3 }' test.psv 
  • -v OFS=\|分配OFS變量的值|。它是BEGIN { OFS = "|" }區塊的替代方案。
  • |需要被shell保護,因爲shell級別的含義是將一個命令的管道輸出到另一個命令的輸入中。使用"|"\|是兩種方法。
+0

工作非常好,非常感謝。小心解釋「|」之間的區別和'\' ?還有'-v'? – Alkiviadis95

2

不要讓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 
+0

不客氣。如果您打算在UNIX上進行更多的文本操作,我強烈推薦Arnold Robbins編寫的「Effective Awk Programming,4th Edition」一書。 –