【问题标题】:Compare two files using awk and print the matched lines使用 awk 比较两个文件并打印匹配的行
【发布时间】:2016-07-30 04:16:24
【问题描述】:

我有两个文件有以下信息。我需要比较 FILE2 中匹配的文件和打印行。

FILE1.txt

martin01
kevin01
phoenix01
samson01
edward01

文件2.txt

martin01.test.com empid: 9874712
martin01.test1.com empid:0972292
kevin01.test.com empid: 3297203
kevin01.test.com empid: 3297203
phoenix01.test.com empid: 9872219
phoenix01.test1.com empid:9803994
samson01.test.com empid: 0983903
samson01 empid: 7665758
edward01.test.com empid: 0979072
edward01.test2.com empid: 748840
gregory01.test.com empid: 657758
clevin01.test.com empid:6589598

预期的输出应该是这样的:

martin01.test.com empid: 9874712
martin01.test1.com empid:0972292
kevin01.test.com empid: 3297203
kevin01.test.com empid: 3297203
phoenix01.test.com empid: 9872219
phoenix01.test1.com empid:9803994
samson01.test.com empid: 0983903
samson01 empid: 7665758
edward01.test.com empid: 0979072
edward01 empid: 748840

这是我写的,但有些地方错了..

awk 'FNR==NR {a[$1]; next} $1 in a' FILE1.txt FILE2.txt

【问题讨论】:

  • 为什么是 edward01 empid?不是 edward01.test2.com empid 吗?

标签: awk


【解决方案1】:

你需要将FS设置为.:

awk -F'[.[:space:]]' 'FNR==NR {a[$1]; next} $1 in a' FILE1.txt FILE2.txt

【讨论】:

  • 嗨 Ed,我已经修改了我的问题,因为我想匹配没有分隔符“。”的字符串。还有
  • "edward01 empid: 748840"
  • martin01.test.com empid: 9874712 martin01.test1.com empid:0972292 kevin01.test.com empid: 3297203 kevin01.test.com empid: 3297203 phoenix01.test.com empid: 9872219 phoenix01. test1.com empid:9803994 samson01.test.com empid: 0983903 edward01.test.com empid: 0979072
  • @user3834663,然后使用-F '[.[:space:]]
  • 根据 glenn 的建议更新了答案以使用 . 或空格作为分隔符。 @A.Danischewski - -F "" 将在某些 awks 中将记录拆分为单个字符字段,因此不知道您打算在哪里建议我们在这种情况下使用它。
【解决方案2】:

替代awk

$ grep -Ff file1 file2

martin01.test.com empid: 9874712
martin01.test1.com empid:0972292
kevin01.test.com empid: 3297203
kevin01.test.com empid: 3297203
phoenix01.test.com empid: 9872219
phoenix01.test1.com empid:9803994
samson01.test.com empid: 0983903
samson01 empid: 7665758
edward01.test.com empid: 0979072
edward01.test2.com empid: 748840

请注意,匹配在行中的任何位置,不仅限于第一个字段。如果您的字段是不相交的集合,请使用此选项。

【讨论】:

  • 不错,但它会匹配 file1 在 file2 中的任何位置。
  • grep -f <(sed 's/^./^&/g' file1.txt) file2.txt
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 2017-07-30
  • 1970-01-01
  • 2021-06-15
  • 2012-09-25
  • 2020-10-05
  • 2017-07-07
  • 2020-12-13
相关资源
最近更新 更多