如何根据第二个文件中的信息删除文件中的某些列?

如何根据第二个文件中的信息删除文件中的某些列?

我有两个如下所示的文件:

file1:

1 235 283 567 1001 1002 1009
1 1 2 1 2 0 1
0 0 0 0 0 2 2
1 2 2 2 2 2 2

file2: 
1 567 1002 1009

我想垂直连接这些文件,即输出应仅包含file1第一行上的值与以下值相同的那些列file2

输出:

1 567 1002 1009
1 1 0 1
0 0 2 2
1 2 2 2

有什么建议吗?

答案1

awk

awk '
NR==FNR{for(i=1;i<=NF;i++){values[$i]};next}
FNR==1{for(i=1;i<=NF;i++){if ($i in values){nf[i]}}}
{sp=""; for(i=1;i<=NF;i++){if (i in nf){printf("%s%s",sp,$i);sp=" "}}}{print ""}
' file2 file1

首先读取file2,将每个值保存到一个数组中,values然后进行处理file1- 在第一行,它检查哪些字段是公共的,并将这些字段编号保存到另一个数组中,nf然后将其用作参考来有选择地打印相应的列。

答案2

如果由在线人做任务:

cut -d' ' -f $(
    echo $(
        head -1 file1 | tr ' ' '\n' |
        grep -nxf <(tr ' ' '\n' <file2) |
        cut -d: -f1
        ) |
    tr ' ' ','
) file1

或者与雷神的评论

cut -d' ' -f $(
    head -1 file1 | tr ' ' '\n' |
    grep -nxf <(tr ' ' '\n' <file2) |
    cut -d: -f1 | 
    paste -sd ,
) file1

相关内容