【问题标题】:Append to same line in Bash追加到 Bash 中的同一行
【发布时间】:2017-03-18 22:56:48
【问题描述】:

文件 letters.csv 包含:

b,a,c,

文件 numbers.csv 包含:

32
34
25
13

我想像这样将 numbers.csv 附加到 letters.csv:

b,a,c,32,34,25,13

我试过这个:

sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv >> letters.csv

但是,这会将附加的条目放在新的一行:

b,a,c,
32,34,25,13

我希望所有条目都在同一行。如何做到这一点?

【问题讨论】:

  • 追加输出重定向 (>>) 追加到文件末尾的任何位置。如果那里有换行符,则附加数据将在其后出现。如果没有尾随换行符,则附加字节出现在同一行。
  • 如果我是你,我也会在数字行中添加一些字母。

标签: bash list csv sed append


【解决方案1】:

您可以单独使用paste

首先,将numbers.csv 中的内容转换为逗号分隔值。 -s 是串行选项,-d, 指定逗号作为分隔符:

$ paste -sd, numbers.csv
32,34,25,13

然后通过指定一个空分隔符和process substitution,将此输出附加到letters.csv

$ # use -d'\0' for non-GNU version of paste
$ paste -d '' letters.csv <(paste -sd, numbers.csv) > tmp && mv tmp letters.csv
$ cat letters.csv
b,a,c,32,34,25,13


要修改 OP 中发布的sed 命令,请使用command substitution

$ sed -i -e "s/$/$(sed -e :a -e '{N; s/\n/,/g; ta}' numbers.csv)/" letters.csv
$ cat letters.csv
b,a,c,32,34,25,13

【讨论】:

    【解决方案2】:

    你可以使用tr:

    cat letters.csv numbers.csv | tr '\n' ',' | sed 's/,$/\n/'
    

    (我希望这不是对cat的无用使用。:-))

    需要末尾的sed 将最后一个, 替换为换行符。

    【讨论】:

    • 好一个,可以添加| sed 's/,$/\n/'以删除尾随,并添加换行符:)
    • 如果您包含@Sundeep 的建议,这可能是最好的解决方案。
    【解决方案3】:

    awk 来救援!

    $ awk 'NR==FNR{printf "%s",$0; next} 
                  {print $0} 
               END{ORS="\n"; print ""}' letters ORS=, numbers | 
      sed '$s/,$//'    # to delete last ","
    
    b,a,c,32,34,25,13
    

    【讨论】:

      【解决方案4】:
      awk 'FNR==NR{t=$0;next}{s=s","$0}END{print t s}' letters.csv numbers.csv 
      

      【讨论】:

      • 这是 awk 的一个很好的替代品,但是它不能处理 letter.csv 中的尾随 ,.. 这很容易用 awk 'FNR==NR{t=$0;next}{s=FNR==1?$0:s","$0}END{print t s}' letters.csv numbers.csv 修复
      猜你喜欢
      • 2017-03-18
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 2016-12-25
      • 1970-01-01
      相关资源
      最近更新 更多