Bash 将特定列从 TSV 文件提取到新文件,并添加带有提取列标题的额外列



>我有这样的文件

name  AD01392 AV93289 AG98023 A723928
xyb323 232    3232    8992    3278
xyb897 343    434     344     3434 
xyvg87 439    3434    2434    43434

我需要将此文件中的信息提取到 4 个单独的文件中提取第 1 列并迭代第 2、3 和 4 列,然后添加另一列,其中包含提取列的标题

文件 1

name  AD01392 
xyb323 232    AD01392
xyb897 343    AD01392
xyvg87 439    AD01392

文件 2

name  AV93289 
xyb323 3232   AV93289
xyb897 434    AV93289  
xyvg87 3434   AV93289 

其他 2 个文件依此类推。

我可以使用

awk '{print $1,$2}' file.tsv > file1.tsv
awk '{print $1,$3}' file.tsv > file2.tsv
awk '{print $1,$4}' file.tsv > file3.tsv
awk '{print $1,$5}' file.tsv > file5.tsv

但不确定如何从每列中提取第一行并将其作为一列添加到所有行。

非常感谢您的帮助和贡献。

您能否尝试按照awk进行操作,并让我知道这是否对您有帮助。

awk 'FNR==1{a[1]=$1;for(i=2;i<=NF;i++){a[i]=$i;print a[1],a[i] > "File"++q;}next} {for(j=2;j<=NF;j++){print $1,$j,a[j] > "File"++o};o=""}'  Input_file

现在也添加一个非一个衬里形式的解决方案。

awk '
FNR==1{
  a[1]=$1;
  for(i=2;i<=NF;i++){
    a[i]=$i;
    print a[1],a[i] > "File"++q}
  next}
{
  for(j=2;j<=NF;j++){
    print $1,$j,a[j] > "File"++o}
  o=""
}
'  Input_file
您可以使用

以下内容:

awk 'NR==1{save=$2;print $1,$2}NR>1{print $1,$2,save}' file.tsv > file1.tsv
awk 'NR==1{save=$3;print $1,$3}NR>1{print $1,$3,save}' file.tsv > file2.tsv
awk 'NR==1{save=$4;print $1,$4}NR>1{print $1,$4,save}' file.tsv > file3.tsv
awk 'NR==1{save=$5;print $1,$5}NR>1{print $1,$5,save}' file.tsv > file5.tsv

打印最后一列,您只需将$2$3$4$5的内容保存在 tmp 变量中,您将在整个文件过程中重复使用该变量。默认情况下,输出字段分隔符是空格,但您可以根据需要通过覆盖变量OFS的内容来更改它,因此,如果您想例如将t作为分隔符

awk 'NR==1{OFS="t";save=$2;print $1,$2}NR>1{print $1,$2,save}' file.tsv > file1.tsv
awk 'NR==1{OFS="t";save=$3;print $1,$3}NR>1{print $1,$3,save}' file.tsv > file2.tsv
awk 'NR==1{OFS="t";save=$4;print $1,$4}NR>1{print $1,$4,save}' file.tsv > file3.tsv
awk 'NR==1{OFS="t";save=$5;print $1,$5}NR>1{print $1,$5,save}' file.tsv > file5.tsv

起色:

我还建议使用以下awk命令来处理文件一次且仅一次(假设您的大文件需要 2 小时才能处理(

awk 'BEGIN{OFS="t"}NR==1{save2=$2;save3=$3;save4=$4;save5=$5;print $1,$2> "file1.tsv";print $1,$3 > "file2.tsv"; print $1,$4 > "file3.tsv"; print $1,$5 > "file5.tsv";}NR>1{print $1,$2,save2 > "file1.tsv"; print $1,$3,save3 > "file2.tsv"; print $1,$4,save4 > "file3.tsv"; print $1,$5,save5 > 
"file5.tsv";}' file.tsv

其中awk代码为:

BEGIN{
    OFS="t"
}
NR==1{
    save2=$2;
    save3=$3;
    save4=$4;
    save5=$5;
    print $1,$2> "file1.tsv";
    print $1,$3 > "file2.tsv";
    print $1,$4 > "file3.tsv";
    print $1,$5 > "file5.tsv";
}
NR>1{
    print $1,$2,save2 > "file1.tsv";
    print $1,$3,save3 > "file2.tsv";
    print $1,$4,save4 > "file3.tsv";
    print $1,$5,save5 > "file5.tsv";
}

测试:

$ more file?.tsv
::::::::::::::
file1.tsv
::::::::::::::
name    AD01392
xyb323  232     AD01392
xyb897  343     AD01392
xyvg87  439     AD01392
::::::::::::::
file2.tsv
::::::::::::::
name    AV93289
xyb323  3232    AV93289
xyb897  434     AV93289
xyvg87  3434    AV93289
::::::::::::::
file3.tsv
::::::::::::::
name    AG98023
xyb323  8992    AG98023
xyb897  344     AG98023
xyvg87  2434    AG98023
::::::::::::::
file5.tsv
::::::::::::::
name    A723928
xyb323  3278    A723928
xyb897  3434    A723928
xyvg87  43434   A723928

最新更新