【问题标题】:subsetting rows from a file by matching columns from another file通过匹配另一个文件中的列来对文件中的行进行子集化
【发布时间】:2021-06-10 16:27:51
【问题描述】:

我有制表符分隔文件,文件文件 1 和文件 2。我想创建一个文件 3 子集行,其中包含文件 1 中的所有四列,匹配文件 2 中的第 1 列和第 2 列,file1 看起来像:

1 17626 A G 
1 20184 G A
1 108826 C G
1 108929 G C

并且,file2 为:

1 17626 
1 20184

我希望文件 3 中的输出如下所示

1 17626 A G
1 20184 G A

查看前面的问题,我尝试了以下代码:

awk -F '\t' 'NR==FNR{c[$1$2]++;next};c[$1$2]'  file2   file1 > file3

awk -F '\t' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0'  file2   file1 > file3

awk -F '\t' 'NR==FNR{a[$1$2]; next} FNR==1 || $1$2 in a' file2   file1 > file3

从以上两个命令,我得到一个空文件。而且,使用最后一个命令,我只得到一行输出,而不是预期的两行。

【问题讨论】:

  • 至少你的最后一次试验工作正常,考虑到你用FNR==1处理标题,$1$2 in a没有括号,$1$2应该是($1,$2)并且你不考虑\r行尾.

标签: awk


【解决方案1】:

使用您展示的示例,请尝试以下操作。

awk 'FNR==NR{arr[$1,$2];next} (($1,$2) in arr)' Input_file2  Input_file1

如果它的制表符分隔然后尝试以下操作:

awk 'BEGIN{FS=OFS="\t"} FNR==NR{arr[$1,$2];next} (($1,$2) in arr)' file2 file1

说明:为上述添加详细说明。

awk '                         ##Starting awk program from here.
FNR==NR{                      ##Checking condition FNR==NR which will be TRUE when file2 is being read.
  arr[$1,$2]                  ##Creating array arr with index of $1 and $2 here.
  next                        ##next will skip all further statements from here.
}
(($1,$2) in arr)              ##Checking if $1,$2 is present in arr then print line.
' Input_file2  Input_file1    ##Mentioning Input_file names here.

【讨论】:

  • @AVA,以我的拙见,我会要求您为此打开一个新问题,您可以在您的努力中添加完整的详细信息(以代码形式),我们可以在那里讨论。编辑基地问答会让用户感到困惑,欢呼。一旦你打开一个新的,请告诉我。
  • 感谢您的建议。我现在提出了一个新问题。
猜你喜欢
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2013-08-29
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
相关资源
最近更新 更多