2017-02-24 91 views
1

我有一個包含50個文本文件的文件夾,我想從命令行中提取每個文件的第一行並將其輸出到result.txt文件。使用awk從目錄中的所有文本文件中提取特定行

我使用一個包含我的工作文件的目錄中的以下命令:

for files in *; do awk '{if(NR==1) print NR, $0}' *.txt; done > result.txt 

當我運行的命令時,的Result.txt文件包含50條線,但他們都從目錄中的單個文件而不是每個文件一行。常見的似乎是循環50次,而不是每個50個文件。

如果有人能幫助我瞭解我在哪裏出錯,我將不勝感激。

回答

2

爲什麼不使用磁頭?例如與find:

find midir/ -type f -exec head -1 {} \; >> result.txt 

如果你想追隨你的方法,你需要指定的文件,而不是使用通配符使用awk:

for files in *; do awk '{if(NR==1) print NR, $0}' "$files"; done > result.txt 
3

試試這個 -

for i in *.txt;do head -1 $i;done > result.txt 

OR

for files in *.txt;do awk 'NR==1 {print $0}' $i;done > result.txt 
+0

優秀,非常感謝你們。這兩種解決方案都能起到一定的作用 – DanielH

3

您的代碼有兩個問題:

  1. 你有一個外循環,迭代*,但你的循環體不使用$files。也就是說,你要調用awk '...' *.txt 50次。這就是爲什麼在result.txt中awk的輸出重複50次。

  2. 你AWK代碼檢查NR(讀取行數到目前爲止),不FNR(行數讀當前文件內)。 NR==1只在第一個文件的開頭纔是真實的。

還有另外一個問題:result.txt首次創建,因此它被列入其中*.txt。爲了避免這種情況,可以給它一個不同的名稱(不以.txt結尾的名稱)或將其放在不同的目錄中。

一個可能的解決辦法:

awk 'FNR==1 {print NR, $0}' *.txt > result 
相關問題