whileループ内でuntilループをどのように使用できるかは不明です。複数の列を並べ替え、キーごとの出力ファイルを使用
私はこのようになり50万ラインの入力ファイルがあります。
9 1 1 0.6132E+02
9 2 1 0.6314E+02
10 3 1 0.5874E+02
10 4 1 0.5266E+02
10 5 1 0.5571E+02
1 6 1 0.5004E+02
1 7 1 0.5450E+02
2 8 1 0.5696E+02
11 9 1 0.6369E+02
.....
をそして私は達成するために望んでいることは、私はすべて引き出すことができるよう、番号順に最初の列に数字を並べ替えることです(同じ番号で始まる行)を新しいテキストファイル"cluster${i}.txt"
にコピーします。そこから("cluster${i}.txt"
)ファイルの第4列を番号順にソートしたいと思います。ソート後、ソートされた各"cluster${i}.txt"
ファイルの最初の行を1つの出力ファイルに書きたいと思います。
1 6 1 0.5004E+02
1 7 1 0.5450E+02
1 11 1 0.6777E+02
....
だけでなく、次のようになりoutput.txtとファイル:ここで
1 6 1 0.5004E+02
2 487 1 0.3495E+02
3 34 1 0.0344E+02
....
は、私が書いたものです:
#!/bin/bash
input='input.txt'
i=1
sort -nk 1 $input > 'temp.txt'
while read line; do
awk -v var="$i" '$1 == var' temp.txt > "cluster${i}.txt"
until [[$i -lt 20]]; do
i=$((i+1))
done
done
for f in *.txt; do
sort -nk 4 > temp2.txt
head -1 temp2.txt
rm temp2.txt
done > output.txt
"cluster1.txt"
のサンプル出力は、このことを希望します
http://shellcheck.net/はあなたの友人です。 –
... btw、これは、シェルループの中に小さな小さなawk呼び出しの束ではなく、1つの大きな 'awk'スクリプトで(もっと速く、より効率的に)行うほうが**大変です**。 –
...同様に、 '> foo'は実際には高価な操作です - そのリダイレクションの行が実行されるたびに、コマンドの前に' foo'を開き、その後にそれを閉じます。あなたは効率的な観点から、ファイルをもっと長く開いたほうがはるかに優れています。 –