2014-02-20 52 views
1

我已經看到了這個問題的幾個變種,但沒有一個答案對我的特定場景有所幫助。如何防止在使用awk時出現新行

我想加載一些文件,添加一個文件名列。這工作正常,只有當我把文件名作爲第一列。如果我把文件名列放在最後(我想要的地方),它會在$ 0和剩下的打印之間創建一條新線,我無法停下來。

for f in "${FILE_LIST[@]}" 
do 
awk '{ print FILENAME,"\t",$0 } ' ${DEST_DIR_FILES}/$f > tmp ## this one works 
awk '{ print $0,"\t",FILENAME } ' ${DEST_DIR_FILES}/$f > tmp ## this one does not work 
mv tmp ${DEST_DIR_FILES}/$f 
done > output 

示例數據:

- 我開始與此:

A  B  C 
aaaa bbbb cccc 
1111 2222 3333 

- 我想這(與文件名新列):

A  B  C  FILENAME 
aaaa bbbb cccc FILENAME 
1111 2222 3333 FILENAME    

- 我收到了這個(\ t和新文件名):

A  B  C 
     FILENAME 
aaaa bbbb cccc 
     FILENAME 
1111 2222 3333 
     FILENAME 

獎金問題 我使用一個變量來傳遞文件名,但它是把整個路徑。什麼是最好的方式只打印文件名(沒有路徑)〜或者 - 使用保存路徑的變量去掉文件路徑?

回答

2

這幾乎可以肯定是行結束的問題,因爲您的awk腳本在語法上是正確的。我懷疑你的"${FILE_LIST[@]}"中的文件來自Windows盒子,並有\r\n行結尾。爲了證實給定文件的行結束符,你可以在每個文件file filename運行file命令:

# create a test file 
$ echo test > foo  

# use unix2dos to convert to Windows style line endings 
$ unix2dos foo  
unix2dos: converting file foo to DOS format ... 

# Use file to confirm line endings 
$ file foo  
foo: ASCII text, with CRLF line terminators 

# Convert back to Unix style line endings 
$ dos2unix foo 
dos2unix: converting file foo to Unix format ... 

$ file foo 
foo: ASCII text 

將文件轉換爲Unix風格的行結束\n運行以下命令:

$ for "f" in "${FILE_LIST[@]}"; do; dos2unix "$f"; done 

說明:

FILENAME是T上的第一串他排隊回車\r實際上什麼都不做,因爲我們已經在線的開始。當我們嘗試在任何其他字符後面打印FILENAME時,我們會看到我們被帶到下一行開頭的效果,然後打印TAB,然後打印FILENAME

旁註:

Awk具有可變OFS用於設置輸出字段分隔符這樣:

$ awk '{print $0,"\t",FILENAME}' file 

可以改寫爲:

$ awk '{print $0,FILENAME}' OFS='\t' file 

獎金回答

最好的方法I.M.Ò剝離文件的路徑是使用效用basename

$ basename /tmp/foo 
foo 

使用command substitution

$ awk '{print FILENAME}' $(basename /tmp/foo) 
foo 
+0

PERFECT !!!這是CRLF,所以在轉換它之後就起作用了。這是我第一次嘗試awk,所以我從來不會想到我自己。 – xine78

+0

+1。但是,如上所示的外部'basename'方法的問題是,只有當你在文件所在的目錄中時纔有效。我只是'awk'{fname = FILENAME;子(/.*\//, 「」,FNAME);打印fname}'/ tmp/foo'。 –

相關問題