文本处理 - 用逗号连接每两行

mtk*_*mtk 42 text-processing paste

我在一个文件中有 1000 多行。文件开始如下(添加行号):

Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR
Run Code Online (Sandbox Code Playgroud)

我需要将它转换为一个文件,通过每两行加入逗号分隔的条目。最终数据应如下所示

Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...
Run Code Online (Sandbox Code Playgroud)

我正在尝试的是 - 尝试编写一个 shell 脚本,然后在echo它们之间使用逗号。但我想一个更简单有效的单线可以在sed/ 中完成这里的工作awk

有任何想法吗?

Jan*_*ary 53

只需使用cat(如果你喜欢猫;-))和paste

cat file.in | paste -d, - - > file.out
Run Code Online (Sandbox Code Playgroud)

说明:paste从多个文件中读取并将相应的行粘贴在一起(第一个文件的第 1 行和第二个文件的第 1 行等):

paste file1 file2 ...
Run Code Online (Sandbox Code Playgroud)

我们可以使用-(破折号)代替文件名。paste从file1(这是stdin)中获取第一行。然后,它想从 file2(这也是 stdin)读取第一行。然而,由于标准输入的第一行已经被读取和处理,现在等待输入流的是标准输入的第二行,它很paste高兴地粘在第一行上。该-d选项将分隔符设置为逗号而不是制表符。

或者,做

cat file.in | sed "N;s/\n/,/" > file.out
Run Code Online (Sandbox Code Playgroud)

PS 是的,可以将上述简化为

< file.in sed "N;s/\n/,/" > file.out
Run Code Online (Sandbox Code Playgroud)

或者

< file.in paste -d, - - > file.out
Run Code Online (Sandbox Code Playgroud)

其优点是不使用cat.

但是,为了清楚起见,我并没有故意使用这个习语——它不那么冗长,我喜欢cat(猫很好)。所以请不要编辑。

或者,如果您更喜欢粘贴到猫(粘贴是水平连接文件的命令,而 cat 垂直连接它们),您可以使用:

paste file.in | paste -d, - -
Run Code Online (Sandbox Code Playgroud)

  • 连字符的意思是“从标准输入读取”。如果重复相同的输入源,paste 知道每行输出要从中读取几次。 (3认同)

小智 10

如果登陆这里的任何人都希望将所有行组合成一个 CSV one liner,请尝试

cat file | tr '\n' ','
Run Code Online (Sandbox Code Playgroud)


Gur*_*uru 5

sed 'N;s/\n/,/' file
Run Code Online (Sandbox Code Playgroud)

使用 sed,每 2 行 join(N) 一次,并将换行符 (\n) 替换为“,”。