循环AWK命令不起作用

时间:2016-01-20 21:13:15

标签: bash awk

我有一个庞大的字典文件,其中包含每行中的每个单词,并希望按照单词的第一个字符拆分文件。

a.txt - >仅包含以

开头的单词

我使用这个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 

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

1 个答案:

答案 0 :(得分:2)

因为你的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的文件名中的>

您还可以将shell变量转换为带有-v的awk变量,并执行以下操作:

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