我知道这个问题之前可能会回答很多次,但我不能采纳我的问题的答案,因为我不知道如何阅读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
提前谢谢。
答案 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
以及调用tags
和data
以更好地适应您感知的语义(不是吗?)有点模糊?我的意思是,如果你想在命令行上使用... data tags
,因为它更符合操作的更好的你的模型,你必须在awk
调用上交换参数,因为,当然,必须在tags
之前阅读data
文件。
我修改了要考虑新请求的参数数量。