【问题标题】:awk with joined field带有连接字段的 awk
【发布时间】:2014-01-20 18:15:45
【问题描述】:

我正在尝试根据另一个文件从一个文件中提取数据。 来自 file1 的子字符串用作在 file2 中查找匹配项的索引。 当要在 inf file2 中搜索的字符串是空格或孤立的字符串时,所有工作都有效,但是当连接到其他字段时,awk 无法找到它。有没有办法让 awk 匹配 file2 中字符串的任何部分?

awk -vv1="$Var1" -vv2="$var2" '
    NR==FNR {
        if ($4==v1 && $5==v2) {
            s=substr($0,4,8)
        echo $s 
            a[s]++
        }
        next
    }
    !($1 in a) {
        print
    }' /tmp/file1 /tmp/file2

有效的例子: 文件1:

1  554545352014-01-21      2014-01-21T16:18:01     FS  14001 1         1.10
1  554545362014-01-21      2014-01-21T16:18:08     FS  14002 1         5.50

文件2:

55454535   11       17   102  850Sande Fiambre   1.000
55454536   11       17    17  238Pesc. Dourada   1.000

不起作用的例子:

文件2:

 5545453501/21/20142       1716:18 1   1     116:18
 5545453601/21/20142       1716:18 1   1     216:18

要搜索的字符串,例如:55454535 在工作示例中找到匹配项,但在底部找不到匹配项。

【问题讨论】:

  • 鉴于您对 bdrx 的回答的评论,我认为您将需要将您的 in a 匹配转换为 a 和正则表达式 ~ 匹配每个项目的循环。
  • 从你的 awk 脚本中去掉虚假的 shell 命令echo $s。 awk 将其视为空变量echo 和由变量s 中包含的任何数字索引的字段的字符串连接,因此如果s 设置为55454535,那么您正在访问字段@987654333 @.
  • @Ed Morton,你建议我用什么来代替 echo $s ?
  • 您是否要打印 s 的值?然后print s.
  • 不,我正在打印 file2 中与 file1 中的子字符串 s 匹配的记录

标签: regex bash awk


【解决方案1】:

你可能想替换这个:

!($1 in a) {
    print
}

有了这个(或类似的 - 你的要求不清楚):

{
    found = 0
    for (s in a) {
        if ($1 ~ "^"s) {
            found = 1
        }
    }
    if (!found) {
        print
    }
}

【讨论】:

  • 就是这样。它完美地工作。我没有打印,而是将结果捕获到一个变量中以进行后处理,但它确实有效。谢谢
【解决方案2】:

使用正则表达式比较 ~ 而不是 ==

例如。 if ($4 ~ v1 && $5 ~ v2)

如果您希望单词仅以字符串开头,则在 v1/v2 前添加 ^,如果您希望单词仅以字符串结尾,请在前面添加 $

【讨论】:

  • 在这种情况下,比较是在那里进行的:!($ 1 in a)我如何在那里使用正则表达式比较!?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多