我想通过与 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
每行具有一个正整数的那些行。任何其他组合都会被拒绝。