各列にテキストを追加[重複]

各列にテキストを追加[重複]

私は次の行を持っています

3, 3, 100
4, 2, 50
8, 5, 80
.
.
.

私は次のような出力が欲しい

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80
.
.
.

以下を試しました。sed 's/^/line starts at /'その後、このコマンドを出力に適用しました。sed 's/, / and ends at /'その後、このコマンドを出力に適用しましたsed 's/, / with value /'。一行にできる方法はないでしょうか?

答え1

awkこのフォーマットされた入力の場合、フォーマットされた出力は便利です。

awk -F, '{printf("line starts at %d and ends at %d with value %d\n", $1, $2, $3)}' file 
line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80

答え2

シェルwhile readループprintf:

while IFS=', ' read c1 c2 c3; do
    printf 'line starts at %s and ends at %s with value %s\n' \
        "$c1" "$c2" "$c3"
done <file

IFS変数をスペースとカンマに設定すると、readコマンドはこれらの文字をフィールド区切り文字として使用します。

出力:

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80

答え3

sedに-eオプションがあることがわかりました

sed -e 's/^/line starts at /g' -e 's/, / and ends at /' -e 's/, / with value at /'

答え4

シェル自体でこれを行う簡単で迅速な方法があります。


# cat f
3, 3, 100
4, 2, 50
8, 5, 80

# cat f | while read line ;  do  IFS=", " array=($line) ; echo "line starts at ${array[0]} and ends at ${array[1]} with value ${array[2]}"; done 

line starts at 3 and ends at 3 with value 100
line starts at 4 and ends at 2 with value 50
line starts at 8 and ends at 5 with value 80

関連情報