BC**-tmp1.tsv
爆発出力の最初の反復という名前の複数のファイルと、BC**-tmp2.tsv
2番目の反復という名前の異なるファイルがあります。
ファイルの例BC02-tmp1.tsv
(区切り文字\t
:):
BC02 Aaa 2712 94 0 99.073 2053209 CP023507.1 1597 A
BC02 Bbb 2712 94 0 99.073 2053209 CP023507.1 1597 B
BC02 Ccc 2712 94 0 99.073 2053209 CP023507.1 1597 C
BC02 Ddd 2712 94 0 99.073 2053209 CP023507.1 1597 D
ファイルの例BC02-tmp2.tsv
(区切り文字\t
:):
BC02 Eee 2712 94 0 99.073 2053209 CP023507.1 1597 E
BC02 Fff 2712 94 0 99.073 2053209 CP023507.1 1597 F
BC02 Ggg 2712 94 0 99.073 2053209 CP023507.1 1597 G
BC02 Hhh 2712 94 0 99.073 2053209 CP023507.1 1597 H
私の目標は、特定の方法でこれらすべてのファイルをペア(繰り返し1 +反復2)に結合することです。
BC02
結果の例と最終ファイルの例:
BC02 Aaa 2712 94 0 99.073 2053209 CP023507.1 1597 A B C BC02 Eee 2712 94 0 99.073 2053209 CP023507.1 1597 E F G
したがって、より正確には、ファイルの最初の行を(同じ行に)印刷しBC**-tmp1.tsv
、2行目の最後の列、3行目の最後の列、ファイルの1行目、BC**-tmp2.tsv
そしてThe 2行目の最後の列、3行目の最後の列です。各バーコードペアにも同様に適用されます。
ノート: 2 番目の反復ファイルが常に存在するわけではありません。
これまでシェルループから関連ファイルを収集しましたが、for
残りはどのように実行するのかわかりません。
touch template.tsv
for bla in *-tmp1.tsv; do
r="$(basename -s "-tmp1.tsv" $bla)"
awk 'FNR==1' $bla >> template.tsv
awk 'FNR==1' $r-tmp2.tsv >> template.tsv;
done
どうすればわかりますか?
より簡単な入力/出力のために編集します。
入力する:
$ head BC02-tmp*.tsv
==> BC02-tmp1.tsv <==
a b B
a c C
a d D
a e E
==> BC02-tmp2.tsv <==
a w W
a x X
a y Y
a z Z
出力:
a b B C D a w W X Y
答え1
入力に特別なケースがないと仮定すると、プログラムに接続された次のシェルループはawk
次のことを行う必要があります。
for f in BC*-tmp1.tsv
do
f2="${f/%tmp1.tsv/tmp2.tsv}"
if [[ ! -f $f2 ]]; then f2=""; fi
awk 'BEGIN{FS=OFS="\t"}
FNR==1{for (i=1;i<NF;i++) printf "%s%s",(NR==FNR&&i==1?"":OFS),$i}
FNR<=3{printf "%s%s",OFS,$NF}
END{printf "%s",ORS}' "$f" "$f2" >> template.tsv
done
tmp1.tsv
その後、すべてのファイルを繰り返して、tmp2.tsv
そのファイルに対応するファイル名を生成します。 2番目のファイルがない場合、ファイル名は空の文字列に設定されます。
awk
次に、印刷する2つのリンクTSVファイルを含むプログラムを呼び出します。すべて同じ行にあります。
- 各入力ファイルの最初の行のすべてのフィールド(最後のフィールドを除く)(ただし、2番目の入力ファイルの場合は前に追加のOFSがあり、ファイルごとの行カウンタはグローバル行
FNR
とNR
同じではありません)カウンタ)、 - 3行まで各行の最後のフィールド、
- 入力ファイルが残っていないときに終了レコード区切り記号(デフォルトは改行)
2番目のテンプレートファイルが存在しない場合でもtemplate.tsv
機能します。空の文字列トークンはawk
最初に入力ファイルとして認識されないため、END
改行文字を印刷する部分が最初のファイルの後に到着するためです。 。