awk-複数の.datファイルの2行目を1つのファイルに出力する


9

次のような複数のファイルがあります:(実際には80あります)

file1.dat

2 5

6 9

7 1

file2.dat

3 7

8 4

1 3

2行目がすべて含まれているファイルが必要です。すなわち

output.dat

6 9

8 4

これまでのところ、ファイル名をループしますが、その前にファイルを上書きします。たとえば、上記のファイルの出力は次のようになります

8 4

私のシェルスクリプトは次のようになります。

post.sh

TEND = 80

TINDX = 0

while [ $TINDX - lt $TEND]; do

awk '{ print NR==2 "input-$TINDX.dat > output.dat

TINDX = $((TINDX+1))

done

回答:


17

whileループを削除し、シェルブレース展開とFNR組み込みawk変数を使用します。

awk 'FNR==2{print $0 > "output.dat"}' file{1..80}.dat

9
さらに短いawk 'FNR==2' file{1..80}.dat > output.dat
アーケマー2015年

7

何についての... head -n 2 input.dat | tail -n 1 | awk...


はい、head/ tailは間違いなくオプションですawk。その場合は必要ありません。
jimmij 2015年

7

sed 十分でしょう:

sed -sn 2p file{1..80}.dat > output.dat

-s 各ファイルの2行目を印刷するにはオプションが必要です。それ以外の場合は、最初のファイルの2行目のみが印刷されます。


2

sedはい、aragaerのソリューションは最高です。しかし、私は少しhead|tailカットを楽しんでいるのでhead|tail、単一のファイルだけでなく、複数のファイルをサポートするソリューションを持っていますinput.dat。また、sedにファイルのリストを渡す代わりにforループを使用すると、sedで2行目を抽出する前/後にファイルで他のことを簡単に実行できます。

# empty output.dat first
rm output.dat

# have a one-liner
for file in *.dat; do head -2 $file | tail -1 >> output.dat; done 

たくさんコメントされた複数行バージョン:

注意:以下のコードが実行されます。私たちは、後に改行を入れて自由である|&&または||、そして次の行に私たちのコマンドを続けます。間にコメントを入れることもできます。私はこれを知らないまま何年も費やしました(そして、実際にはどこにも見ていません)。このスタイルはインタラクティブプロンプトではあまり役に立ちませんが、スクリプトファイルをクリーンアップします。

# empty output.dat first
rm output.dat

for file in *.dat; do
    # file -> lines 1 and 2 of file
    head -2 $file |
    # lines 1 and 2 of file -> line 2 of file >> appended to output.dat
    tail -1 >> output.dat
done

0

これを行う方法は明らかにたくさんあります。@ aragaerのsedの回答が一番好きだと思います。

純粋なbashビルトインを使用し、外部ユーティリティをフォークする必要がないものを次に示します。

for f in file{1..80}.dat; do
    { read && read && printf "%s\n" "$REPLY"; } < "$f"
done > output.dat

0

複数のファイルでここで回答を効率的に使用するにはawk、ステートメントをsed使用してのnextfile不要な行の処理をスキップすることをお勧めしawkます。

awk 'FNR==2{ print >"output.dat"; nextfile}' infile{1..80}.dat

を使用するとsed、3 行目の処理を終了しsedて次のファイルを処理できます。

sed -sn '2p;3q' infile{1..80}.dat > output.dat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.