awk而不是加入

时间:2014-11-16 08:45:55

标签: join awk

我知道这个问题之前可能会回答很多次,但我不能采纳我的问题的答案,因为我不知道如何阅读awk代码,不幸的是,因为我在截止日期前不会有时间自己研究。

我需要找到一个基于列连接两个文件的awk解决方案,用于代替连接。这两个文件可以有任意数量的列(实际上我将在几种情况下使用它),并且我将匹配第一列的第n列和第二列的第n列。请解释哪些部分将被更改用于新用途(即用于指示将要匹配的列)。

一个例子(但文件可能要长得多):

文件1:

7A5 miR1 A2LD1 miR2 A2MP1 mirR3 A4GALT miR4

和文件2:

1559361_at 7A5 1566764_at 7A5 229819_at A1BG 221217_s_at A2BP1 235070_at A2BP1 232422_at A2LD1 237869_at A2LD1

我希望得到:

1559361_at 7A5 miR1 1566764_at 7A5 miR1 232422_at A2LD1 miR2 237869_at A2LD1 miR2

提前谢谢。

2 个答案:

答案 0 :(得分:0)

一种简单的方法是使用file1的内容构建一个哈希/数组,并在运行file2时检查哈希中是否存在条目;

awk 'NR==FNR {h[$1]=1; next} {if(h[$2]) print $0}' file1 file2

NR==FNR {h[$1]=1; next}只需从file1获取第1列,并将其用作值为1的哈希中的键。也就是说,file1中的所有值都将作为键输入到值为1的哈希中。

{if(h[$2]) print $0}将遍历file2,只打印散列中第二列所在的所有行。

答案 1 :(得分:0)

% cat pick_on_col
awk -v tcol=$1 -v dcol=$2 '
  NR==FNR {tags[$tcol]=1; next}t.
          {if($dcol in tags)print}' "$3" "$4"
% sh pick_on_col 1 2 tags data
1559361_at      7A5
1566764_at      7A5
232422_at       A2LD1
237869_at       A2LD1
% 

您可能希望在脚本中交换$2$3以及调用tagsdata以更好地适应您感知的语义(不是吗?)有点模糊?我的意思是,如果你想在命令行上使用... data tags,因为它更符合操作的更好的你的模型,你必须在awk调用上交换参数,因为,当然,必须在tags之前阅读data文件

修改

我修改了要考虑新请求的参数数量。