【问题标题】:how to use index of awk for loop in the regular expression如何在正则表达式中使用 awk for 循环的索引
【发布时间】:2012-04-05 04:10:48
【问题描述】:

我把问题缩短了。实际上我的数据比这长得多。

我有一个类似的文件:

aa, bb, cc, dd, ee, 4
ff, gg, hh, ii, jj, 5
kk, ll, mm, nn, oo, 3
pp, qq, rr, ss, tt, 2
uu, vv, ww, xx, yy, 5
aa, bb, cc, dd, ee, 2

现在我想使用 awk 选择最后一列中具有相同编号的每一行并将其重定向到一个新文件中,这些新文件将根据最后一列中的编号而有所不同。 例如。 t2.txt, t3.txt, t4.txt, t5.txt 将分别保存最后一个数字为 2,3,4,5 的行。

在 t2.txt 中:

pp, qq, rr, ss, tt, 2
aa, bb, cc, dd, ee, 2

在 t3.txt 中:

kk, ll, mm, nn, oo, 3

在 t4.txt 中:

aa, bb, cc, dd, ee, 4

在 t5.txt 中:

ff, gg, hh, ii, jj, 5
uu, vv, ww, xx, yy, 5

我想我需要这样的东西:

BEGIN   {FS=","}
        {
        for (n=2; n<=5; n++)
        if ($6 ~/\$n/) {print > "t\$n.txt"}
        }       

但我只是不知道如何使它工作。

这个 bash 文件做我想做的事,但问题是,每次它提取具有特定数字的行时,它都必须读入所有行。如何仅检查文件的时间并提取所有数字的文件?

#!/bin/bash
for num in {2..5}; do      
gawk --assign FS="," "\$6 ~/${num}/" infile >> t${num}.txt
done

【问题讨论】:

    标签: regex for-loop awk redirect


    【解决方案1】:

    尝试下一个命令:

    awk '{ print $0 > ("t" $NF ".txt") }' infile
    

    无需更改FS,因为它默认为空格字符。您可以使用NF 变量立即访问最后一个字段。

    注意:文件名字符串连接需要用括号括起来,否则 awk 会因为语法错误而混淆。

    【讨论】:

    • 文件名连接需要parens,否则awk会因为语法不合法而混淆。
    • @andrewdotnich:谢谢。它在GNU Awk 4.0.0 中没有括号也可以工作,但可能不适用于以前的版本,所以接受了你的建议。
    • 也许这是个笨蛋——我在我的 Mac 上尝试了几个版本的 awk 都抱怨......
    • 谢谢!也许我不清楚,但它对我不起作用。我的问题是,我想根据最后一行的数量写入不同的文件。
    • 是的,我同意。不用改“FS”,谢谢指出。
    【解决方案2】:

    我得到了答案,它的工作原理如下: 但欢迎任何进一步的解释。

    BEGIN   {FS=","}
            {
            for (n=1; n<=5; n++)
            if ($6 ~/\$n/) {print > "new"$n".txt"}
            }
    

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 2021-05-15
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      相关资源
      最近更新 更多