フィールド数がわからず、CSVの各フィールドを改行で印刷します。

フィールド数がわからず、CSVの各フィールドを改行で印刷します。

私は今日IFSで遊んで、1行にカンマ区切りの数字のリストを含むクイックテキストファイルを作成しました。

1,2,3,4,5

次に、改行文字に各数字を印刷するスクリプトを書いてみました。動作させることはできますが、どのくらいのフィールドがあるかを知る必要があります。長いリストでこれを行う方法を見つけようとしていますが、すべてのフィールドを指定したくありません。

#!/bin/bash
IFS=,
while read num1 num2 num3 num4 num5
do
printf $num1"\n"
printf $num2"\n"
printf $num3"\n"
printf $num4"\n"
printf $num5"\n"
printf "\n"
done < "$1"

結果は次のとおりです。

keismbp13b:tmp$ ./ifs.sh list
1
2
3
4
5
keismbp13b:tmp$

改行文字からリストを分離するには、awkなどを使用する必要がありますが、他の方法があるかどうか疑問に思います。

ありがとうございます!

投稿後、私もこれができることに気づきました。

tr , "\n" < list

とにかく、リストを最初に分離せずにこれを実行できますか?

ベストアンサー1

あなたの質問で指摘したように、tr以下を使用してこれを行うことができます。

tr ',' '\n' < infile

これを行う他のオプションは次のとおりです。

sed -e $'s/,/\\\n/g' infile

または:

sed 's/,/\
/g' infile.txt

または、一部のsed実装では次のものを使用します。

sed 's/,/\n/g' infile

または、次のようにawk(最後の空行が気に入らない場合):

awk -v RS=',' '1' infile

またはbash:

#!/bin/bash
while IFS='' read -r line; do 
    echo "${line//,/$'\n'}";
done < infile

または、配列を読んだら、次の手順を実行しますprintf

#!/bin/bash
while IFS=, read -a fields; do
    printf "%s\n" "${fields[@]}";
done < infile
  • ..., 2 4, ...各フィールドは上記のようにカンマで区切られています。それ以外の場合は、IFSfrom IFS=','toに追加してIFS=', '個別に印刷できます。

おすすめ記事