【问题标题】:Need an awk script or any other way to do this on unix需要 awk 脚本或任何其他方式在 unix 上执行此操作
【发布时间】:2011-05-03 09:57:40
【问题描述】:

我有大约 50 行和 2 个字段的小文件,如下所示

file1
-----
12345   8373
65236   7376
82738   2872
..
..
..

我有大约 100 个以逗号"," 分隔的文件,如下所示:

file2
-----
1,3,4,4,12345,,,23,3,,,2,8373,1,1

每个文件有很多行类似于上面的行。 我想从所有这 100 个文件中提取 第 5 个字段等于第一个文件中的第 1 个字段,并且 第 13 个字段等于第一个文件中的第 2 个字段

我想使用单个文件搜索所有 100 个文件?

如果是单个逗号分隔文件,我想出了以下内容。我什至不确定这是否正确! 但我有多个逗号分隔的文件。

awk -F"\t|," 'FNR==NR{a[$1$2]++;next}($5$13 in a)' file1 file2

谁能帮帮我?

编辑: 上面的命令在单个文件的情况下工作正常。

【问题讨论】:

  • 你说,“我什至不确定这是否正确!”如果这里有人给你一个不同的脚本,你怎么知道它是否正确?
  • 字段1和5要匹配,字段2和13要匹配,行号也要匹配?换句话说,如果字段匹配,但它们仅在第一个文件的第 1 行和第二个文件的第 42 行匹配,则这些行并不真正匹配。对吗?
  • 行可能不匹配。顺便说一句,我测试了我的命令,并且在单个文件的情况下它可以正常工作。
  • 它是否适用于多个文件?如果没有,有什么问题?您收到错误消息了吗?

标签: bash shell unix scripting awk


【解决方案1】:

这是另一个使用数组,避免多个工作文件:

#!/bin/awk -f

FILENAME == "file1" {
    keys[$1] = ""
    keys[$2] = ""
    next
}

{
    split($0, fields, "," )
    if (fields[5] in keys && fields[13] in keys) print "*:",$0
}

我使用 split 是因为两个文件中的字段分隔符不同。如有必要,您可以交换它。您应该这样调用脚本:

runit.awk file1 file2

另一种方法是显式打开第一个文件(使用“open”)并在 BEGIN 块中读取它(readline)。

【讨论】:

    【解决方案2】:

    这是一个简单的方法。从小文件中提取每一行,将其拆分为字段,然后使用 awk 从与这些字段匹配的其他文件中打印行:

    while read line
    do
       f1=$(echo $line | awk '{print $1}')
       f2=$(echo $line | awk '{print $2}')
       awk -v f1="$f1" -v f2="$f2" -F, '$5==f1 && $13==f2' file*
    done < small_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多