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.

最初の列は1語、2番目の列は文です。出力を次のように表示したいだけです

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

ただし、出力は次のように1行に1単語をトークン化しています。

apple.txt
Give
me
an
iPad

何が悪いのかわからない!!! 誰か助けてもらえますか?

4

2 に答える 2

2

while readループはすでに行全体を取得しているので、ループの意図が何であるかはわかりませんfor。単語をループして、1行に1つずつ出力しています。

また、printf行にパーセント記号または円記号が含まれている場合は、安全ではありません。

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

また、ほとんどのUnixファイルシステムでは大文字と小文字が区別されます(OS Xのデフォルトは1つの注目すべき例外です)。書かれているように、これはとの代わりにファイルをApple.txt作成Google.txtapple.txtますgoogle.txt。小文字のファイル名が必要な場合は、その追加リダイレクトのターゲットを少し変更する必要があります。

bash 4を使用している場合は、。に置き換えることができ"$company.txt"ます"${company,,}.txt">>"$(tr A-Z a-z <<<"$company").txt"古いbashバージョンでは、実行または同様のことができます。

于 2012-12-13T00:06:09.530 に答える
1

for line in $sentence?をドロップします (さらに小さくしてください!)

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