2017-07-31 49 views
0

我想用AWK 來代替我的第5列與文件名的文件在我想這awk的變化列名作爲文件名

#!/bin/bash 
For i in ls; do 
awk '{$5 = "$i"; print}' $i > $i_edit 

但我不知道爲什麼我不能運行,你知道我的錯誤在哪裏嗎? 它不喜歡我的第一行。 我的文件就像這裏面。
我的檔案名稱是Balteni_SV_ed2_MT_2016_D_P10_G + C_-4040m。
也許我必須刪除第一行和最後一行?但是我有很多像這樣的文件。我不想覆蓋但編輯它,分離是空間。

PROFILE Balteni_SV_ed2_M TYPE 3   unspecified  m m 
363923.46104 372500.00000 0    4040.000  Balteni_SV_ed2_MT_20   unspecified 
363780.87963 372530.87963 0    4040.000  Balteni_SV_ed2_MT_20   unspecified 
363750.00000 372535.75894 0    4040.000  Balteni_SV_ed2_MT_20   unspecified 
EOD 

我想是這樣的:

PROFILE Balteni_SV_ed2_M TYPE 3   unspecified  m m 
363923.46104 372500.00000 0    4040.000  Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m   unspecified 
363780.87963 372530.87963 0    4040.000  Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m   unspecified 
363750.00000 372535.75894 0    4040.000  Balteni_SV_ed2_MT_2016_D_P10_G+C_-4040m   unspecified 
EOD 
+0

您是否希望每個文件做到這一點?你想覆蓋原始文件嗎?這些文件是什麼樣子的?請[編輯]您的問題以提供更多詳細信息。注意'For'和'for'不一樣,'for'循環以'done'結尾。 –

+0

這就是你的輸入,輸出結果應該是什麼樣子?這些字段是固定寬度還是製表符分隔的,還是其他的? –

+0

awk不賣。 awk腳本之外的'i'是一個shell變量。你的awk腳本中的''我是'awk變量。除了有一個共同的名字之外,它們是完全無關的。 –

回答

1

這裏是另一種方式

for f in *; do awk '{$5=FILENAME}1' "$f" > "$f"_edited; done 

跳過第一行添加NR>1預選賽和跳過最後一行,您可以檢查現場計數,例如

for f in *; do awk 'NR>1 && NF>4 {$5=FILENAME}1' "$f" > "$f"_edited; done 
+0

我不認爲這會產生預期的產出。 –

+0

你是說第一/最後一行的條件?我更新了答案。 – karakfa

+0

是的,它完美的作品! –

1

所有你真正需要的是:

awk 'FNR==1{close(f); f=FILENAME"_edit"} {$5=FILENAME; print > f}' * 

,並與您輸入不修改第一行和最後一行:

awk 'FNR==1{close(f); f=FILENAME"_edit"} FNR>1 && NF>1{$5=FILENAME} {print > f}' *