简单的6行bash脚本循环...什么是错的?

时间:2012-12-12 23:56:21

标签: bash unix loops while-loop

我有一个TSV文件,如下所示:

input.tsv
Apple       Give me an iPad. 
Apple       I love MacBookPro!
Google      Buy the Nexus.
Google      Chromebooks are easy to use.
Microsoft   Surface is awesome.

第一列是一个词,第二列是一个句子。我只想让我的输出看起来像

apple.txt
Give me an iPad.
I love the MacBook Pro!

google.txt
Buy the Nexus.
Chromebooks are easy to use.

这是我的剧本:

while read -r company sentence
do
    for line in $sentence
    do
        printf "$line\n" >> $company.txt
    done
done < input.tsv

但输出是每行标记一个单词,如:

apple.txt
Give
me
an
iPad

我无法弄清楚出了什么问题!有人可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

while read循环已经占据整行,所以我不确定for循环的意图是什么。你循环翻译单词并每行输出一个。

此外,如果该行中包含百分号或反斜杠,则printf不安全。

while read -r company sentence; do
  printf '%s\n' "$sentence" >>"$company.txt"
done < input.tsv

此外,大多数Unixy文件系统都区分大小写(OS X上的默认值是一个值得注意的例外);如上所述,这将创建文件Apple.txtGoogle.txt,而不是apple.txtgoogle.txt。如果你想要小写的文件名,那么你需要稍微改变那个追加重定向的目标。

如果您使用的是bash 4,则可以将"$company.txt"替换为"${company,,}.txt"。在较旧的bash版本中,您可以>>"$(tr A-Z a-z <<<"$company").txt"或类似。

答案 1 :(得分:1)

放弃for line in $sentence? (让它更小!)

while read -r company sentence
do
    printf '%s\n' "$sentence" >> $company.txt
done < input.tsv