ファイルから値をgrepし、FILENAMEに基づいて別のファイルに印刷する方法

ファイルから値をgrepし、FILENAMEに基づいて別のファイルに印刷する方法

A_bla.csv(例:など...)などの複数のファイルがありますB_bla.csv C_bla.csv(これは実際のファイルのソートサブサンプルですが、開くことは実際です)。

1,test,test2,55.2,test3
1,test,test2,96.3,test3
1,test,test2,64.2,test3
1,test,test2,97.2,test3

と基本ファイルmain.tsv(フィールド区切り記号= \t):

id  coverage    clade
A   wrongdata   20
B   wrongdata   19
C   wrongdata   19

*_bla.csvcoverage各ファイルの4列、89行のフィールドをファイル列に印刷したいと思いますmain.tsv。これを行うには、*_bla.csvファイルのFILENAMEを使用し、それをidファイル列のパターンとして使用する必要がありますmain.tsv

これまで私は次のことを試しました。

for file in *_bla.csv ; do
r="$(basename -s "_bla.csv" $file)"
awk ... ; 
done

しかし、今すぐ答えを始めましょう。 Linuxシステムに組み込まれているツール(awk、grep、sed、python、perl...)のみを使用してこれを行う方法をご存知ですか?ありがとう

ベストアンサー1

避けられないGNUsedライン:

sed '1n;h;s/\([[:alnum:]]\).*/sed -E "89!d;s_([^,]*,){3}__;s_,.*__" \1_bla.csv/e;G;s/\(.*\)\n\(.*\)wrongdata/\2\1/' main.tsv

魔法は何ですか?e代替コマンドのxecuteオプションを使用し、別のコマンドを使用してs89行目の4番目のフィールドを抽出します。sed詳細:

  • 1n最初の行は変更せずに残します。
  • h混乱する前に予約済みのスペースに行を保存してください
  • \([[:alnum:]]\).*行全体を一致させ、交換時に\(\)参照できるように、最初の英数字フィールドをキャプチャします。\1
  • sed -E "89!d;s_([^,]*,){3}__;s_,.*__" \1_bla.csv代替方法は次のとおりです。 89以外のすべての行が削除され、最初の3つのdフィールドが削除され、最後に新しい最初のフィールド以降のすべての項目が削除されます。したがって、実際には89行の4番目のフィールドだけが残っているため、eバッファの実行によってこのフィールドが返されます。
  • これで、ストレージスペースにストレージラインを追加してG抽出されたフィールドに置き換えることができますs/\(.*\)\n\(.*\)wrongdata/\2\1/wrongdata

おすすめ記事