2015-09-28 49 views
0

我希望整個原始文件的最後一列是文件名(不含路徑名)。這似乎很簡單,但每一次嘗試都未能實現。我的目標是將FLD0037變成FLD0 $ {ID}。awk basename作爲列變量

我曾嘗試以下:

cat FLD0037.txt | awk '{print $0, FILENAME;}' >FLD0037.test1.txt 

test.1給出 - 在最後一欄。

cat FLD0037.txt | awk '{print $0, basename(FILENAME);}' >FLD0037.test2.txt 

檢驗。2是一個空文件

cat FLD0037.txt | awk '{print $0, basename;}' >FLD0037.test3.txt 
cat FLD0037.txt | awk -F"/" '{print $0, $NF;}' >FLD0037.test4.txt 
cat FLD0037.txt | awk -F"/" '{print $NF;}' >FLD0037.test5.txt 
cat FLD0037.txt | awk '{print basename $0;}' >FLD0037.test6.txt 

test.3,test.5和test.6看起來像原來的文件,沒有寫在最後一欄。

test.4是在新列中複製數據的原始文件。

謝謝,

+0

當您運行'cat FLD0037.txt | awk'{print $ 0,basename(FILENAME);}'> FLD0037.test2.txt'並注意到'test.2是一個空文件'你沒有注意到更重要和有用的錯誤信息'awk:cmd 。行:1:(FILENAME =文件FNR = 1)致命:函數'基名'未定義'或類似?不要在shell循環中這樣做,因爲awk完全能夠打開和關閉多個文件,並且它會比shell循環更有效,更健壯,更便攜。你有GNU awk嗎?如果有,是什麼版本?如果沒有 - 獲得gawk 4.0或更高版本。 –

回答

0

cat超過useless在這裏,因爲在awk結束讀取標準輸入(因此-僞文件名),而不是實際的文件。

一如既往,修復很簡單:不要使用無用的cat

awk '{print $0, FILENAME;}' FLD0037.txt >FLD0037.test1.txt 
+0

工作得很好,我所要求的唯一改進就是如何在整個文件路徑被指定時編寫它,並且只有沒有路徑的文件名作爲列變量。 – user3146560

+1

'{l = split(FILENAME,b,「/」);打印$ 0,b [l]}'? – tripleee

+1

或作爲優化'FNR == 1 {l = split(FILENAME,b,「/」); basename = b [l]} {print $ 0,basename}' – tripleee