我有 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 列),如下图所示:
文件中的第一列和第二列.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
orOFS
并且您正在使用$NF
而不是$2
识别第二个字段(并"-"
在您想要的时候使用"--"
,但这是nbd)。
不过你已经很接近了,试试这个:
$ 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