【问题标题】:looping over AWK commands doesn't work [duplicate]循环遍历 AWK 命令不起作用 [重复]
【发布时间】:2016-01-20 21:13:14
【问题描述】:

我有一个巨大的字典文件,其中包含每行中的每个单词,并且想按单词的第一个字符拆分文件。

a.txt --> 只包含以a开头的单词

我使用这个 awk 命令成功提取了以 b 开头的单词。

  awk 'tolower($0)~/^b/{print}' titles-sorted.txt > b.txt

现在我想对所有字母进行迭代

  for alphabet in {a..z} 
    do
        awk 'tolower($0)~/^alphabet/{print}' titles-sorted.txt > titles-links/^alphabet.txt
    done 

但结果文件不包含任何内容。我做错什么了?我什至不知道如何调试这个。谢谢!

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    因为你的 awk 程序是单引号,所以不会有任何 shell 变量扩展。在这个例子中:

    awk 'tolower($0)~/^alphabet/{print}' titles-sorted.txt > titles-links/^alphabet.txt
    

    ...您正在寻找以文字字符串 alphabet 开头的行。

    这可行:

    awk "tolower(\$0)~/^$alphabet/{print}" titles-sorted.txt > titles-links/$alphabet.txt
    

    注意几点:

    • 我们使用双引号,它不会抑制 shell 变量扩展。
    • 我们需要转义$0 中的$,否则shell 会扩展它。
    • 我们需要将alphabet 替换为$alphabet,因为这就是您引用shell 变量的方式。
    • 我们需要将传递给>的文件名中的^alphabet替换为$alphabet

    您还可以使用-v 将 shell 变量转换为 awk 变量,然后执行以下操作:

    for alphabet in {a..z} ; do
        awk -valphabet=$alphabet 'tolower($0)~"^"alphabet {print}' /usr/share/dict/words > words-$alphabet.txt
    done
    

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 2017-06-24
      • 2021-09-23
      • 2018-10-15
      • 1970-01-01
      • 2017-02-03
      • 2020-07-19
      • 1970-01-01
      • 2020-02-12
      相关资源
      最近更新 更多