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.csv
coverage
各ファイルの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オプションを使用し、別のコマンドを使用してs
89行目の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