我想从文件中提取特定列,列号是使用 shell 脚本在不同文件中给出的吗?

我想从文件中提取特定列,列号是使用 shell 脚本在不同文件中给出的吗?

我想通过与 file2 进行比较来从 file1 中提取特定列,其中给出了应该从 file1 中提取的列号。

文件 1(源数据)如下所示:

  1  2  3  4  5 10 11 14  
  13 25 37 2 4 7  9 23  
  12  12 23 15 17 18 24 25

文件 2(包含要提取的列号):

  2  
  4  
  5

所以我想比较file1和file2。使用文件 2,我想从文件 1 中提取列号 2,4,5。

期望的输出:

  2 4 5  
  25 2 4  
  12 15 17  

我该如何继续呢?

答案1

也试试

awk '
FNR == NR       {COL[NR] = $1                   # get column numbers from file2
                 MX = NR                        # retain max line No. in file2
                 next
                }
                {for (i=1; i<=MX; i++)  printf "%s%s", $(COL[i]), (i==MX)?ORS:OFS
                                                # print those columns, and field
                                                # or line separator
                }
' file2 file1
2 4 5
25 2 4
12 15 17

答案2

Perl

perl -pale '$"="\t";
   chomp(@A = map { $_-1 } grep { /^[1-9]\d*$/m } <STDIN>) if $. == 1;
   $_ = @A ? "@F[@A]" : last;
' File1 < File2

结果:

2   4   5
25  2   4
12  15  17

解释:

将 stdin 上的列号文件(每行一列号)提供给 Perl 实用程序,并将数据文件提供给 Perl 命令行。

设置数组元素连接器 ($") 到 a ,TAB以便所有输出字段都以制表符分隔。

当我们检测到要打印的列数组@A为空时,立即退出程序。它仅包含File2每行具有一个正整数的那些行。任何其他组合都会被拒绝。

相关内容