1

次のような 100 個のテキスト ファイルがあります。

File title
4
Realization number
variable 2 name
variable 3 name
variable 4 name
1   3452  4538   325.5

7 行目の最初の数字 (1) は認識番号で、ファイル名に関連付ける必要があります。つまり、最初のファイルは file1.txt と呼ばれ、認識番号は 1 です (上記のように)。2 番目のファイルは file2.txt と呼ばれ、7 行目に認識番号 2 が必要です。file3.txt の 7 行目に認識番号 3 が含まれている必要があります。

残念ながら、すべてのファイルには realization=1 があり、ファイル名に応じてインクリメントする必要があります。

各ファイルの 7 行目 (3452、4538、および 325.5) から変数 2、3、および 4 を抽出し、summary.txt という要約ファイルに追加します。

1つのファイルから情報を抽出する方法を知っています:

awk 'NR==7,NR==7{print $2, $3, $4}' file1.txt

これは、正しく私に与えます:

3452 4538 325.5

私の最初の問題は、このコマンドを複数のファイルで bash スクリプトから実行すると、同じ結果が得られないように見えることです。

#!/bin/bash    
for ((i=1;i<=100;i++));do
    awk 'NR=7,NR==7{print $2, $3, $4}' File$((i)).txt
done

上記のスクリプトを使用すると、画面に複数の行が出力されます。

次に、これらの値を正しい前の認識番号とともに要約ファイルに出力したいと思います。つまり、次のようなファイルが必要です。

1  3452  4538  325.5
2  4582  6853  158.2
...
100  4865 3589  15.15

助けてくれてありがとう!

4

3 に答える 3

3

いくつかのことを単純化して、目的の結果を得ることができます:

#!/bin/bash    

for ((i=1;i<=100;i++))
do
    echo $i $(awk 'NR==7{print $2, $3, $4}' File$i.txt)
done

本当に NR=7 に割り当てたくない (あなたがしたように) し、NR==7,NR==7どちらかを繰り返す必要もありません。また、十分な$((i))場合の表記は本当に必要ありません。$i

すべてのファイルが正確に 7 行の長さである場合、awk(100 個のファイルではなく) 1 つのコマンドですべてを実行できます。

awk 'NR%7==0 { print ++i, $2, $3, $4}' Files*.txt
于 2012-12-12T00:28:02.577 に答える
1

=bash スクリプトには 1 つしかないことに注意してください。すべてのファイルに正確に 7 行ありますか? 7 行目にのみ関心がある場合は、次のようにします。

#!/bin/bash    
for ((i=1;i<=100;i++));do
    awk 'NR==7{print $2, $3, $4}' File$((i)).txt
done

認識番号は 1 から始まるため、コマンドを使用して単純に追加できますnl

たとえば、bash スクリプトが呼び出されs.shた場合:

./s.sh | nl > summary.txt

予想される行で結果が得られますsummary.txt

于 2012-12-12T00:27:55.840 に答える
0

使用する1つの方法は次のawkとおりです。

awk 'FNR==7 { print ++i, $2, $3, $4 > "summary.txt" }' $(ls -v file*)

フラグは-v単にグロブをバージョン番号でソートします。お使いのバージョンがlsこのフラグをサポートしていない場合は、ls file* | sort -V代わりに:を試してください。

于 2012-12-12T00:51:49.507 に答える