スクリプトエラーの修正

スクリプトエラーの修正

私はファイルの最小値を見つけるためにいくつかの行を書き、正しい結果を得ましたが、行を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ずつ増加します。

FNRFILENAME組み込み 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番目のフィールドを含む行を印刷します。

おすすめ記事