Shell

我想從文件中提取特定的列,列號是使用 shell 腳本在不同的文件中給出的?

  • January 23, 2020

我想通過與 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  

我該如何進行呢?

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

解釋:

將標準輸入上的列號文件(每行一列 num)提供給 perl 實用程序,並將數據文件提供給 Perl 的命令行。

將數組元素連接符 ( $") 設置為 a TAB,以便所有輸出欄位都以 TAB 分隔。

一旦我們檢測到要列印的列數組 ,@A發現為空,就退出程序。它只包括那些File2每行有一個正整數的行。拒絕任何其他組合。

也試試

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

引用自:https://unix.stackexchange.com/questions/563362