使用 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(假设您的文件中没有空格,其中发生了 shell 分词)

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

答案2

  1. 纯的POSIX sh,(因为它不加载外部程序,所以对于小文件来说这是最快的,如果dash是当前的 shell):

    n='"'; while read x; do n="$n$x, "; done < file; echo ${n%,*}\"
    
  2. Pure bash,(对于小文件来说最快,如果bash是当前的 shell):

    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 "\""}'

相关内容