如何通过在 Linux 上组合其他两个列来在 tsv 文件中创建一个新列?

如何通过在 Linux 上组合其他两个列来在 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 列),如下图所示:

在此输入图像描述

文件中的第一列和第二列.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

您的脚本失败,因为您没有指定FSorOFS并且您正在使用$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

相关内容