2

我有一个 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

我不知道怎么了!!!任何人都可以帮忙吗?

4

2 回答 2

2

循环已经完成了整while read行,所以我不确定for循环的意图是什么。您正在遍历单词并每行输出一个。

此外,printf如果该行中有百分号或反斜杠,则您的行也不安全。

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

此外,大多数 Unixy 文件系统都区分大小写(OS X 上的默认设置是一个明显的例外);如所写,这将创建文件Apple.txtandGoogle.txt而不是apple.txtand google.txt。如果您想要小写文件名,则需要稍微更改该附加重定向的目标。

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

于 2012-12-13T00:06:09.530 回答
1

Drop the for line in $sentence? (make it even smaller!)

while read -r company sentence
do
    printf '%s\n' "$sentence" >> $company.txt
done < input.tsv
于 2012-12-13T00:02:33.090 回答