【问题标题】:AWK script to process one file and read another处理一个文件并读取另一个文件的 AWK 脚本
【发布时间】:2013-04-07 16:21:09
【问题描述】:

我编写了一个 AWK 脚本来处理一个文本文件,现在需要扩展它,以便处理的输出根据第一个文件中的字段从另一个文件中获取数据。这是我的意思的一个例子;

文件1.txt

abc123~17~yy~12345678
abc456~12~yy~23456789
abc789~34~zz~12345678

文件2.txt

abc123~11~22~33~ABC-57
abc456~22~11~33~ABC-99
abc789~33~22~11~ABC-12

我当前的 awk 脚本从第 4 个字段为“12345678”的 File1.txt 中提取并处理每一行,因此它找到 2 行。

我现在想扩展它,所以从我找到的那一行说

abc123~xx~yy~12345678

我们获取 abc123 并在 File2.txt 中搜索它并打印该行的第 4 个字段。

例如。 我的 awk 脚本将在 File1.txt 的字段 4 中搜索一个标记,然后用字段 1 和 File2.txt 的字段 4 打印与 File1.txt 中的字段 1 相关的行

所以如果我们搜索 12345678,我的输出将是

12345678 abc123 ABC-57 17
12345678 abc789 ABC-12 34

(17 和 34 来自 File1.txt 中的字段 2)。

总而言之,在 File1.txt 的 Field 4 中搜索一个字符串,在 File2.txt 中找到 File1.txt 中的 Field 1 与 File1.txt 中的 Field 1 匹配的行。然后打印

File.Field4 File1.Field1 File2.Field4 File1.Field2

我希望这很清楚。

我尝试在 File2.txt 中查找“abc123”字符串,然后选择第 4 个字段。这似乎不起作用,现在我认为在字段 1 上建立索引并存储字段 4 的 File2.txt 的 AWK 数组可能会做到这一点。

我不知道该怎么做。

(注意,这是我想要做的一个精简示例,我的真正要求是文件中有更多数据)。

【问题讨论】:

    标签: arrays awk


    【解决方案1】:

    这看起来是我想要的解决方案;

    BEGIN { FS="~" }               # Set the field separator. 
    FNR==NR && $4==s {             # If we are in the first file and fourth field equals s 
        a[$1]                      # Create index of field one
        field2[$1]=$2
    
        next                       # Skip to next line
    }
    ($1 in a) {                    # If field one in file2 is in index
        print s,$1,$5,field2[$1]   # Print v, field 1 and field 5 
    }
    

    我认为这是正确的。

    我对解决方案的理解是这样的。首先它在第一个代码块中处理 File1,我可以将我想要的数据存储在数组中。

    然后它在第二个代码块中处理文件 2,条件是 $1 在数组 a 中。如果是,则输出数据,并从文件1中访问field2数组。

    问题解决了,我真正的 AWK 脚本很有效。

    非常感谢您的帮助。

    【讨论】:

      【解决方案2】:

      这一个班轮可以解决问题:

      $ awk -F'~' -v s='12345678' 'FNR==NR&&$4==s{a[$1];next}($1 in a){print s,$1,$5}' file1 file2
      12345678 abc123 ABC-57
      12345678 abc789 ABC-12
      

      说明:

      我们使用-F 选项将字段分隔符设置为~,并使用-v 选项将变量s 的值设置为我们想要匹配的字符串。

      作为带有一些解释性 cmets 的脚本:

      BEGIN { FS="~" }    # Set the field separator. 
      FNR==NR && $4==s {  # If we are in the first file and fourth field equals s 
          a[$1]           # Create index of field one
          next            # Skip to next line
      }
      ($1 in a) {         # If field one in file2 is in index
          print v,$1,$5   # Print v, field 1 and field 5 
      }
      

      您可以像 awk -v '12345678' -f script.awk file1 file2 一样运行它。

      【讨论】:

      • 非常感谢,我已经适应了我的确切需求,但我现在意识到我的示例并不是我想要的。对不起。当我打印结果时,我需要包含 File1.txt 中的一个额外字段,比如第二个字段 ($2)。现在,如果我明白你在上面说的话,在 BEGIN 之后 {..} 中有两组代码,第一组是 File1.txt,第二组是 File2.txt,那么在第二个块中如何我可以从第一个代码块访问数据吗? (这有意义吗?)
      • @Nerdio 我看到你已经自己弄清楚了。不错。
      • 通过 sudo_O 并非没有您的帮助。谢谢,非常感谢。
      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      相关资源
      最近更新 更多