如何在Bash中提取两文件共同:name的首次出现及对应行
问题解决:提取文件中共同名称的首次出现内容
现有两个输入文件,需提取两文件中共同的:name条目及其下方的./name/of/file行,但仅保留file1中每个:name的首次出现。此前使用的Awk命令会输出重复的:name条目(如:name1和:name4的所有出现),不符合需求。
修改后的Awk命令
awk 'FNR==NR { a[$1]; next } /^[[:space:]]*:name/ { curr_name = $0 gsub(/^[[:space:]]/, "", curr_name) if (curr_name in a && !seen[curr_name]) { seen[curr_name] = 1 print curr_name flag = 1 } else { flag = 0 } next } flag { print " " $0 }' file2 file1
命令逻辑说明
- 首先处理
file2,将所有:name条目存入数组a,作为需要匹配的目标集合 - 处理
file1时:- 识别以
:name开头的行(允许行首有空格),去除行首空格后得到标准化的名称curr_name - 若该名称在目标集合中且未被处理过(通过
seen数组标记是否已提取首次出现),则打印名称,开启输出标记flag,并标记该名称为已处理 - 若名称不在目标集合或已被处理过,则关闭输出标记
- 识别以
- 当输出标记
flag为开启状态时,给对应的./name/of/file行添加缩进后打印
输入文件示例
file1
:name1 ./name/of/file [logfile] [ error in file coming since Day : 1 ] ./name/of/file [logfile] [ error in file coming since Day : 1 ] :name2 ./name/of/file [logfile] [ error in file coming since Day : 1 ] :name3 ./name/of/file [logfile] [ error in file coming since Day : 24 ] ./name/of/file [logfile] [ error in file coming since Day : 24 ] :name1 ./name/of/file [logfile] [ error in file coming since Day : 40] ./name/of/file [logfile] [ error in file coming since Day : 40 ] :name4 ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ] :name5 ./name/of/file [logfile] [ error in file coming since Day : 6 ] ./name/of/file [logfile] [ error in file coming since Day : 6 ] :name4 ./name/of/file [logfile] [ error in file coming since Day : 10 ] ./name/of/file [logfile] [ error in file coming since Day : 10 ] ./name/of/file [logfile] [ error in file coming since Day : 10 ] ./name/of/file [logfile] [ error in file coming since Day : 10 ]
file2
:name1 :name3 :name4
期望输出
:name1 ./name/of/file [logfile] [ error in file coming since Day : 1 ] ./name/of/file [logfile] [ error in file coming since Day : 1 ] :name3 ./name/of/file [logfile] [ error in file coming since Day : 24 ] ./name/of/file [logfile] [ error in file coming since Day : 24 ] :name4 ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ] ./name/of/file [logfile] [ error in file coming since Day : 3 ]
内容的提问来源于stack exchange,提问作者aastha
相关产品推荐
相关产品推荐

