逗号分隔行的数据转置

1 投票
6 回答
528 浏览
提问于 2025-04-17 09:41

我有一个文件,这个文件里有一列数据,总共有200行(200*1)。

我想把这些数据整理成一行,并用逗号分隔开。

示例文件

Paul
Pammy
Jacob
Robin 

输出结果

Paul, Pammy, Jacob, Robin

6 个回答

2

这个看起来有效,它在Unix/Linux系统上使用了'tr'命令。

tr '\n', ',' < yourfile
4

awk:

$ awk -v ORS=, 1 file.txt | sed 's/,$/\n/'
Paul,Pammy,Jacob,Robin
  • -v ORS=, 设置输出记录之间用 , 分隔
  • 1 代表真,所以打印每一条记录
  • sed 's/,$/\n/' 去掉结尾的 ,

sed:

$ sed -n '1h;1!H;${g;s/\n/,/gp}' file.txt
Paul,Pammy,Jacob,Robin
  • -n 不输出内容
  • 1h 把第一行放到一个临时空间里
  • 1!H 把第二行到倒数第二行追加到临时空间
  • ${...} 对最后一行执行某些操作
  • g 从临时空间中获取所有内容
  • s/\n/,/g\n 替换成 ,
  • p 打印输出

tr:

$ tr '\n' ',' <file.txt | sed 's/,$/\n/'
5

使用 sed

sed ':a;{N;s/\n/, /};ba' INPUT_FILE

解释:

我不是 sed 的专家,但我来简单说说上面那行代码的意思:

  1. :a

    :label 命令创建了一个叫 a 的标签。这个标签可以和 ba 一起使用,跳转到这个标签的位置。这在创建循环和跳到脚本的最后部分打印当前的内容时很有用。

  2. N

    N 命令会把下一行内容加到当前的内容后面,中间用 \n 分隔。

  3. s/\n/, /

    因为新的一行已经加到了当前内容中,并且用 \n 分隔,所以我们用这个替换命令把 \n 替换成 , 和一个空格,符合需求。

测试:

[jaypal:~/Temp] cat file
Paul
Pammy
Jacob
Robin

[jaypal:~/Temp] sed ':a;{N;s/\n/, /};ba' file
Paul, Pammy, Jacob, Robin

撰写回答