複数の関連ファイルの行を1行にリンクして出力ファイルに追加する方法

複数の関連ファイルの行を1行にリンクして出力ファイルに追加する方法

BC**-tmp1.tsv爆発出力の最初の反復という名前の複数のファイルと、BC**-tmp2.tsv2番目の反復という名前の異なるファイルがあります。

ファイルの例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があり、ファイルごとの行カウンタはグローバル行FNRNR同じではありません)カウンタ)、
  • 3行まで各行の最後のフィールド、
  • 入力ファイルが残っていないときに終了レコード区切り記号(デフォルトは改行)

2番目のテンプレートファイルが存在しない場合でもtemplate.tsv機能します。空の文字列トークンはawk最初に入力ファイルとして認識されないため、END改行文字を印刷する部分が最初のファイルの後に到着するためです。 。

おすすめ記事