私はファイルの最小値を見つけるためにいくつかの行を書き、正しい結果を得ましたが、行を2回繰り返すとエラーが修正されました。
私は何をしていますか:
- すべてのファイルを検索
- ヘッダーの削除
- 9番目の列を使用して科学的表記法でソート
- awkを使用してソートして印刷し、最小の最初の行を取得します。
- また、$iのファイル名を印刷したいと思います。
スクリプト:
#!/bin/bash
for i in `ls -v *.txt`
do
smallestPValue=`sed 1d $i | sort -k9 -g | head -1 | awk '{print $0}'`
echo $i $smallestPValue >> smallesttPvalueAll.txt
done
出力
U1.text 4 rsxxx 1672175 A ADD 759 0.0751 4.918 1.074e-06
U1.txt 4 rsxxxx 1672175 A ADD 759 0.0751 4.918 1.074e-06
U2.txt 16 rsxxxx 596342 T ADD 734 -0.05458 -5.204 2.535e-07
U2.txt 16 rsxxxx 596342 T ADD 734 -0.05458 -5.204 2.535e-07
U3.txt 2 rsxxxx 12426 T ADD 722 0.06825 5.285 1.669e-07
いくつかの行が重複していますが、上記のU3がすでに一度表示されるので、いくつかは問題ありません。これが私が望むものです。 uniqまたはsort -uを使用して重複行を簡単に削除できますが、原因が何であるか疑問に思います。
所望の出力が1行に1回繰り返される。
答え1
awk
私が正しく説明しているなら、おそらくあなたが望むことをすることができます。sort
- 屋根は必要ありません。またはlsを解析する(微妙なヒント:しないでください!)、またはhead
またはsed
。
awk 'FNR > 1 {print FILENAME, $0}' *.txt | sort -k10 -g | sort -u -k1,1
これは各ファイルの最初の行をスキップし、ファイル名とスペース(awkのデフォルトの出力レコード区切り文字または)がORS
前に付けられた残りのすべての行を印刷します。その後、ソートによってフィールド10の一般的な数値ソートが実行されます。最後に、最初のフィールド(ファイル名)のみが一意にソートされ、対応するファイル名を持つ-k1,1
最初の行のみが出力されます。
ここでは、ファイル名を最初のフィールドとして追加したため、フィールド9ではなくフィールド10をソートする必要があるため、他のすべてのフィールド番号は1ずつ増加します。
FNR
FILENAME
組み込み awk 変数です。 FNRは現在のファイルの行番号(awk-lingoの「入力レコード番号」)で、FILENAMEは現在のファイル名です。
今回は、以下を使用する別のアプローチがありますawk
。
#!/usr/bin/awk -f
FNR > 1 && (! s[FILENAME] || $9 < s[FILENAME]) {
s[FILENAME]=$9;
l[FILENAME]=$0
};
END {
for (f in s) {
print f, l[f]
}
}
たとえば、として保存し、実行smallest-pvalue.awk
可能にしたchmod +x smallest-pvalue.awk
後./smallest-pvalue.awk *.txt
。
このawkスクリプトは、名前付き配列の各入力ファイルのフィールド9の最小値を追跡し、一致するs
入力行を配列に保存しますl
。
すべてのファイルを処理したら、ファイル名と各ファイルの少なくとも9番目のフィールドを含む行を印刷します。