使用awk基于来自另一个文件的匹配来更新文件

时间:2016-04-16 17:21:11

标签: awk

我正在尝试根据匹配输出新文件。在var arr = [ {"id": 1, "firstName": "Macko","parentId": 12}, {"id": 2, "firstName": "Jess","parentId": 1}, {"id": 3, "firstName": "Peter","parentId": 1}, {"id": 4, "firstName": "Lisa", "parentId": 1}, {"id": 5, "firstName": "Megan","parentId": 1}, {"id": 6, "firstName": "John", "parentId": 4}, {"id": 7, "firstName": "Joe", "parentId": 4}, {"id": 8, "firstName": "Matthew","parentId": 2}, {"id": 9, "firstName": "Peter","parentId": 2}, {"id": 10, "firstName": "Dio","parentId": 5}, {"id": 11, "firstName": "Hello","parentId": 5}, {"id": 12, "firstName": "Ana", "parentId": 4} ]; var getNestedChildren = function(arr, id, checked) { var out = []; for (var i = 0; i < arr.length; i++) { if (arr[i].parentId === id && checked.indexOf(arr[i].id) === -1) { checked.push(id); var children = getNestedChildren(arr, arr[i].id, checked); if (children.length) { arr[i].children = children; } out.push(arr[i]); } } return out; }; console.log(getNestedChildren(arr, 12, [])); 文件中,有一个ID列表,它们会匹配input文件中的$5。如果两个ID匹配,那么文件中的整行就是新文件的一部分。如果没有找到匹配,则跳过它并继续前进。下面的|会运行,但生成的awk文件为空。谢谢你:)。

输入

new

文件

DACH1
POLE2
GNG7

所需的输出

chr13   60737711    60737910    chr13:60737711-60737910 DIAPH3-673|gc=69.3
chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7

AWK

chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7

2 个答案:

答案 0 :(得分:2)

改用grep。

  grep -w -f inputfile filetomodify > newfile

从我可以看到你只想输出文件中输入文件中有匹配条目的行。这就是grep的世界:) -f告诉它使用一个文件作为输入模式,输入文件中的每一行都是一个模式。

注意:如果你得到的东西比如GNG77-123(因为它从GNG7开始)或AGNG7-123(因为它有GNG7),请使用-w选项(全字匹配)。

答案 1 :(得分:2)

$ awk 'NR==FNR{a[$1];next} {k=$NF; sub(/-.*/,"",k)} k in a' input file
chr13   72337884    72338003    chr13:72337884-72338003 DACH1-674|gc=30.3
chr19   2591538 2591657 chr19:2591538-2591657   GNG7-183|gc=48.7