【问题标题】:Using awk, how to check for patterns from second file in first file and append value to first file depending on pattern existence使用 awk,如何检查第一个文件中第二个文件的模式并根据模式的存在将值附加到第一个文件
【发布时间】:2017-10-28 13:16:48
【问题描述】:

数据.txt:

aaab;10
bbbc;20
abc;30
cc;40

pattern.txt:

aaa
aa
bbb
ccc
3
c+

想要的输出:

aaab;10;2
bbbc;20;2
abc;30;1
cc;40;1

因此,如果pattern.txt中的任何字符串存在于data.txt的column1中,则在data.txt中追加2,如果不存在,则追加1。字符串可以或多或少包含字母、数字、空格等任何字符。

【问题讨论】:

  • 您输入的文件格式不一致,分隔符是:; 或两者兼有。一组是否有意在行尾有一个分隔符而另一组没有?或者,监督?
  • @karakfa,你是对的,分隔符应该是; 抱歉打错了,我现在在原问题的四个地方用; 替换了;
  • @EdMorton 感谢您的帮助,我添加了数据来说明其他问题!
  • @EdMorton 很好,试过了,它产生了误报,因此,它输出行“cc;40;2”而不是“cc;40;1”(应该输出后者) .再次感谢!

标签: string file awk pattern-matching


【解决方案1】:

根据您迄今为止在问题文本和 cmets 中告诉我们的内容的一种可能解释,这可能是您真正需要的:

$ awk '
    BEGIN { FS=OFS=";" }
    NR==FNR { strs[$0]; next }
    { c=1; for (str in strs) if (index($1,str)) {c=2; break} print $0, c }
' patterns.txt data.txt
aaab;10;2
bbbc;20;2
abc;30;1
cc;40;1

当您的输入包含出现在 data.txt 的第二个字段中的 patterns.txt 中的字符串或包含正则表达式元字符,或者您的文件很大或 ....

【讨论】:

  • 非常感谢您提供出色的解决方案和出色的 cmets! :)
  • 不客气。在发布问题时继续前进 1)避免使用“模式”这个词,因为它可能意味着任何东西,使用字符串或正则表达式或条件或任何你真正想要的东西,以及 2)花时间考虑包括下雨天的示例输入脚本可能难以正确处理的情况,因此当我们/您针对它测试潜在解决方案时,我们知道它是否能正常工作,而不仅仅是为某些晴天输入产生预期输出。
【解决方案2】:

这将适用于 gnu awk,但可能不如它可能的那么快:

$ cat data 
aaab;10
bbbc;20
abc:30
cc:40

$ cat patterns
aaa
aa
bbb
ccc

$ awk -F"[:;]" 'FNR==NR{hash[$1]; next}{hash2[++c]=$0 ";" 1} \
{for (i in hash) if ($0~i) {hash2[c]=$0 ";" 2;break}} \
END{for (k=1;k<=length(hash2);k++) print hash2[k]}' patterns data
aaab;10;2
bbbc;20;2
abc:30;1
cc:40;1

就个人而言,我会选择 grep:

grep -f patterns data   #this will bring the matching data
grep -v -f patterns data #this will bring the non matching data

大家一起:

printf '%s;%s\n' "$(grep -f patterns data)" "2" && printf '%s;%s\n' "$(grep -v -f patterns data) "1" 

【讨论】:

  • 乔治,感谢您的解决方案,尽管我在原始问题中犯了一个错误(我错误地将 : 而不是 , 作为 karafka 正确指出的几个地方的分隔符) 您的解决方案仍然适用于这两种情况!很好! :) 我想如果不需要将: 视为分隔符,解决方案可能会更短。
  • @Markus 解决方案对于一个分隔符来说不会那么短。 -F"[:;]" will have to be changed just to -F"[;]"` 部分 - 其余代码应保持不变。
猜你喜欢
  • 2022-10-01
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多