我有两个如下所示的文件:
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