Linuxで他の2つの列を組み合わせてtsvファイルに新しい列を作成するには?

Linuxで他の2つの列を組み合わせてtsvファイルに新しい列を作成するには?

次のファイルを含む70のディレクトリがあります。

STAN002
   |______ STAN002_sasions.tsv
PTAN044
   |______ PTAN044_sasions.tsv
STAN005
   |______ STAN005_sasions.tsv
STAN050
   |______ STAN050_sasions.tsv
QRED034
   |______ QRED034_sasions.tsv
.
.
.
PREC098
   |______ PREC098_sasions.tsv

次の図に示すように、上記のディレクトリの各ファイルには.tsv同じ数の列(30列)があります。

ここに画像の説明を入力してください。

ファイルの最初の列と2番目の列は.tsv次のとおりです。

#gene1    gene2
VAV1      THAP4
ZNF75A    ZNF263
KRCC1     POLR1A
H2AFV     TANC1
B3GALT6  RP3-340N1.5
SH3BP1   CTD-2013M15.1(192243),EMB(3603711)
PTPRO     VASN

では、Linux上のディレクトリ内のすべてのファイル間に新しい列を作成したいとawk or any bash script思います。新しく作成された列はファイルに.tsv配置されます。31st column

1st and 2nd columnsこれは、名前で区切られた結合名のように見えるはずです--31st column次のようにする必要があります。

gene1--gene2
VAV1--THAP4
ZNF75A--ZNF263
KRCC1--POLR1A
H2AFV--TANC1
B3GALT6--RP3-340N1.5
SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO--VASN

このアプローチを試しましたが、エラーが発生しました。

awk '{print $0, $1 "-" $NF}' STAN002_sasions.tsv

Linuxでは、すべてのファイルに対して単一のスクリプトを使用してこれをどのように実行できますか?助けてくれてありがとう。

ベストアンサー1

FSorを指定せず、2番目のフィールドを識別する代わりに使用しているためOFS(必要に応じて使用しますが、これはnbdです)、スクリプトは失敗します。$NF$2"-""--"

しかし、ほとんど似ています。以下を試してください。

$ awk 'BEGIN{FS=OFS="\t"} {print $0, $1 "--" $2}' STAN002_sasions.tsv
#gene1  gene2   #gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

または、入力/出力の例に示すように、入力ファイルの最初の行の最初のフィールドが実際にaで始まる場合は、新しい列#ヘッダーを作成するときにそのフィールドを削除する必要があります。

$ awk 'BEGIN{FS=OFS="\t"} {g=$1} NR==1{sub(/^#/,"",g)} {print $0, g "--" $2}' STAN002_sasions.tsv
#gene1  gene2   gene1--gene2
VAV1    THAP4   VAV1--THAP4
ZNF75A  ZNF263  ZNF75A--ZNF263
KRCC1   POLR1A  KRCC1--POLR1A
H2AFV   TANC1   H2AFV--TANC1
B3GALT6 RP3-340N1.5     B3GALT6--RP3-340N1.5
SH3BP1  CTD-2013M15.1(192243),EMB(3603711)      SH3BP1--CTD-2013M15.1(192243),EMB(3603711)
PTPRO   VASN    PTPRO--VASN

「内部」編集用にGNU awkを持っているかインストールすることができ、すべてのファイルを一度に更新したい場合(明らかに文字列を上記のscript2つのスクリプトのうち使用することにしたスクリプトに置き換えてください):

awk -i inplace 'script' */*_sasions.tsv

それ以外の場合は、実行に時間がかかります。

tmp=$(mktemp) || exit
for file in */*_sasions.tsv; do
    awk 'script' "$file" > "$tmp" &&
    mv -- "$tmp" "$file"
done

おすすめ記事