2014-11-14 67 views
0

我卡住了。說我有4列分隔標籤文件。使用awk替換行尾的空字段

A326931873 2014-10-26 09:55:28.000 N06 D00030131051410 
A326931902 2014-10-26 09:56:10.000 N06 

並且想用\ N替換行末尾的空字段。結果應該是

A326931873 2014-10-26 09:55:28.000 N06 D00030131051410 
A326931902 2014-10-26 09:56:10.000 N06 \N 

我已經試過awk -F'\t' 'BEGIN {sub("", "\N", $4); print}' fileawk -F'\t' 'BEGIN {sub(/^&/, "\N", $4); print}' file和一致好評,沒有運氣。

更新1:建議我也嘗試過使用多個字段,但是awk -F"\t" 'NF<4 {print}' file沒有返回任何結果,即所有行都有四個字段。

UPDATE2cat -vET file顯示

A326931873^I2014-10-26 09:55:28.000^IN06^ID00030131051410^M$ 
A326931902^I2014-10-26 09:56:10.000^IN06^I^M$ 

UPDATE3:刪除回車後cat -vET file顯示

A326931873^I2014-10-26 09:55:28.000^IN06^ID00030131051410$ 
A326931902^I2014-10-26 09:56:10.000^IN06^I$ 

任何建議的解決方案不起作用。

+0

你有一個DOS的fi樂。要使用它,你可以嘗試'dos2unix'。還請檢查這個答案:[我們可以用來將Windows文件轉換爲unix或mac文件的任何命令?](http://stackoverflow.com/a/23255571/1983854)。 – fedorqui

+0

這不是解決方案中的問題,而是您的投入。用前面的鏈接清理它,也許http://stackoverflow.com/a/20601044/1983854 – fedorqui

回答

2

我認爲與空$4行,有一個尾隨<tab> 嘗試這一行:

awk -F'\t' '$NF=!$NF?"\\N":$NF' file 

如果在空場前不<tab>

awk -F'\t' -v OFS="\t" 'NF==3{$4="\\N"}7' file 
1

如果您知道應該有多少個字段,您可以將該值提供給腳本。

然後,在情況下,當前線具有更少的字段可以追加這個給定文本的最後一個:

awk -v fields=5 -F"\t" 'NF<fields {$fields="\\N"} 1' file 

了給定的輸入返回:

A326931873 2014-10-26 09:55:28.000 N06 D00030131051410 
A326931902 2014-10-26 09:56:10.000 N06 \N 

注:

  • 這是可行的,因爲NF代表棕褐色的f,這表示當前行有多少個字段。
  • 我們不得不說$fields="\\N"因爲\需要轉義才能正確處理。否則,如果你只是用\N,你可能會得到這樣的錯誤:

警告:轉義序列\N' treated as plain N」

1

您可以像使用

$ awk 'NF<5{$5="\\N"}1' temp 
A326931873 2014-10-26 09:55:28.000 N06 D00030131051410 
A326931902 2014-10-26 09:56:10.000 N06 \N 
一個非常簡單的格式
0

所以我已經想出了自己的答案awk -F'\t' -v OFS='\t' 'length($4)==1{$4="\N"}1' file

+0

我懷疑'$ 4 =「\ N」'的作品。看到我的答案,瞭解爲什麼你需要使用'\\ N'。 – fedorqui