我有一个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
我无法弄清楚出了什么问题!有人可以帮忙吗?
答案 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.txt
和Google.txt
,而不是apple.txt
和google.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