1

以下のファイルの内容を読み取り、各行の6列目の値を抽出してから、6列目のない各行を出力するスクリプトを作成しようとしています。区切り文字としてコンマが使用されます。

入力:

123,456,789,101,145,5671,hello world,goodbye for now
223,456,789,101,145,5672,hello world,goodbye for now
323,456,789,101,145,5673,hello world,goodbye for now

私がしたことは

#!/bin/bash
for i in `cat test_input.txt`
do
    COLUMN=`echo $i | cut -f6 -d','`
    echo $i | cut -f1-5,7- -d',' >> test_$COLUMN.txt
done

私が得た出力は

test_5671.txt:

123,456,789,101,145,hello

test_5672.txt:

223,456,789,101,145,hello

test_5673.txt:

323,456,789,101,145,hello

「hello」と「world」の間のスペースが区切り文字として使用されたように見えるため、残りの「world、goodbyefornow」は出力ファイルに書き込まれませんでしたか?

正しい出力を取得するにはどうすればよいですか

123,456,789,101,145,hello world,goodbye for now
4

4 に答える 4

2

これは、 cutコマンドでは問題ありませんが、使用しているforループでは問題になります。最初のループ実行では、変数iには。のみが含まれます123,456,789,101,145,5671,hello

入力ファイルを1行ずつ読み取る必要がある場合(あまり効率的ではありません)、次のような読み取りループを使用することをお勧めします。

while read i
 do
  ...
 done < test_input.txt
于 2012-04-18T10:35:56.690 に答える
1
echo '123,456,789,101,145,5671,hello world,goodbye for now' | while IFS=, read -r one two three four five six seven eight rest
do
    echo "$six"
    echo "$one,$two,$three,$four,$five,$seven,$eight${rest:+,$rest}"
done

プリント:

5671
123,456,789,101,145,hello world,goodbye for now

man bash Parameter Expansion構文については、セクションを参照してください:+(基本的に、コンマと$restif$restが定義され空ではない場合に出力されます)。

また、ファイルの内容をループするために使用しないでくださいfor

于 2012-04-18T10:50:32.980 に答える
1

ktfが述べたように、問題は問題ではなくcut、行をに渡す方法にありますcut。彼/彼女が提供した解決策はうまくいくはずです。

または、次の行を使用して同じ動作を実現することもできますawk

awk -F, '{for(i=1;i<=NF;i++) {if(i!=6) printf "%s%s",$i,(i==NF)?"\n":"," > "test_"$6".txt"}}' test_input.txt

わかりやすくするために、ここに詳細なバージョンがあります。

awk -F, '  # "-F,": using comma as field separator
{ # for each line in file

  for(i=1;i<=NF;i++) {  # for each column

    sep = (i == NF) ? "\n" : ","  # column separator
    outfile = "test_"$6".txt"     # output file

    if (i != 6) {  # skip sixth column
      printf "%s%s", $i, sep > outfile
    }

  }

}' test_input.txt
于 2012-04-18T11:09:12.347 に答える
0

tr commendeを使用してespacecarracterを#に変換し、catコマンドを実行した後、それをespaceに再翻訳する簡単なメソッドID 。

于 2012-04-18T10:32:01.903 に答える