2017-02-24 4 views
1

私は50個のテキストファイルを持つフォルダを持っており、コマンドラインでそれぞれの最初の行を抽出してresult.txtファイルに出力します。awkを使ってディレクトリ内のすべてのテキストファイルから特定の行を抽出する

私は私が働いているファイルを含むディレクトリ内で次のコマンドを使用しています:

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

私は、コマンドを実行すると、result.txtファイルが50行が含まれていますが、それらはすべてですファイルごとに1行ではなく、ディレクトリ内の1つのファイルから取得します。一般的なものは、50個のファイルのそれぞれではなく、50回にわたってループするように見えます。

誰かが私がこれで間違っていることを理解するのを助けることができたら、私は感謝します。

答えて

2

なぜ頭を使わないのですか?検索と例えば:

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を使用していないことを、外側のループを持っている:あなたのコードでは、2つの問題があります。つまり、awk '...' *.txtを50回呼び出しています。このためawkの出力はresult.txtで50回繰り返されます。

  2. あなたのawkのコードをチェックしNR(行数がこれまで読んで)、ないFNR(行数は、現在のファイル内を読みます)。 NR==1は、最初のファイルの最初の部分でのみ真です。 result.txtが最初に作成されるので、それは*.txtの中に含まれている:

あり、別の問題があります。これを避けるには、別の名前(.txtで終わらない名前)を付けたり、別のディレクトリに置きます。

可能修正:あなたの両方に

awk 'FNR==1 {print NR, $0}' *.txt > result 
関連する問題