sed/awk タスクリストの使用

sed/awk タスクリストの使用

以下のリストを特定の形式にまとめたいと思います。

現在:

42.53e-12
43.64e-12
45.78e-12
49.86e-12
57.87e-12
73.68e-12
105.3e-12

必要

"42.53e-12, 43.64e-12, 45.78e-12, 49.86e-12, 57.87e-12, 73.68e-12, 105.3e-12"

すべての数字はカンマで区切られ、リストは引用符で囲まれます。

答え1

使用awk:

awk '{printf (NR>1)?", "$0:"\""$0} END {print "\""}' infile

または他の方法で:

awk '$1="\""$1' RS= ORS="\"\n" OFS=', ' infile

echoまたは、コマンドの組み合わせを使用しますsed(ファイルにシェルワードの区切りが発生するスペースがないと仮定します)。

sed 's/ /, /g' <(echo \"$(<infile)\")

答え2

  1. 純粋なPOSIX sh、(外部プログラムをロードしないため、dash現在シェルの場合は小さいファイルの場合は最も高速です):

    n='"'; while read x; do n="$n$x, "; done < file; echo ${n%,*}\"
    
  2. Pure、(現在のシェルbashの場合は小さなファイルの場合は最も速い):bash

    n=$(<file); echo \"${n//
    /, }\"
    
  3. 純粋なsed:

    sed -n 'H;${g;s/\n/, /g;s/, $//;s/, \(.*\)/"\1"/p}' file
    
  4. シェルツール:

    /bin/echo -e \"$(xargs printf "%s, " < file)'\b\b"'
    

答え3

目標を達成するためのいくつかの方法:

paste+sed解決策:

paste -d',' -s file | sed 's/,/, /g; s/^\|$/"/g'

python解決策:

python -c 'import sys; print("\""+", ".join(i.strip() for i in sys.stdin)+"\"")' <file

出力(両方の方法):

"42.53e-12, 43.64e-12, 45.78e-12, 49.86e-12, 57.87e-12, 73.68e-12, 105.3e-12"

答え4

awk 'BEGIN{ ORS=""; pre="\""}{print pre $0; pre=","}END{ORS="\n";print "\""}'

関連情報