次のファイルを含む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
FS
orを指定せず、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を持っているかインストールすることができ、すべてのファイルを一度に更新したい場合(明らかに文字列を上記のscript
2つのスクリプトのうち使用することにしたスクリプトに置き換えてください):
awk -i inplace 'script' */*_sasions.tsv
それ以外の場合は、実行に時間がかかります。
tmp=$(mktemp) || exit
for file in */*_sasions.tsv; do
awk 'script' "$file" > "$tmp" &&
mv -- "$tmp" "$file"
done