私は今日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, ...
各フィールドは上記のようにカンマで区切られています。それ以外の場合は、IFS
fromIFS=','
toに追加してIFS=', '
個別に印刷できます。