Bash 在AWK命令上循环不';行不通

Bash 在AWK命令上循环不';行不通,bash,awk,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-s

我有一个巨大的字典文件,包含每行中的每个单词,并希望按单词的第一个字符分割这些文件

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 

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

因为您的awk程序是单引号,所以不会有任何shell变量展开。在本例中:

awk 'tolower($0)~/^alphabet/{print}' titles-sorted.txt > titles-links/^alphabet.txt
…您正在查找以文字字符串
字母表
开头的行

这将有助于:

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