我的一个文件中有 1000 多行。文件开头如下(已添加行号):
Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR
我需要将其转换为一个文件,通过连接每两行以逗号分隔条目。最终数据应该是这样的
Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...
我正在尝试的是 - 尝试编写一个 shell 脚本,然后echo
在它们之间使用逗号。但我想一个更简单有效的单行语句可能会在sed
/中完成这里的工作awk
。
有任何想法吗?
答案1
只需使用cat
(如果你喜欢猫;-))和paste
:
cat file.in | paste -d, - - > file.out
说明:paste
从多个文件中读取并将相应的行粘贴在一起(第一个文件中的第 1 行与第二个文件中的第 1 行等):
paste file1 file2 ...
-
我们可以使用(破折号)代替文件名。paste
从 file1 (即标准输入)获取第一行。然后,它想要从 file2(也是标准输入)读取第一行。然而,由于 stdin 的第一行已经被读取并处理,现在在输入流上等待的是第二stdin 行,它paste
很高兴地粘附到第一个。该-d
选项将分隔符设置为逗号而不是制表符。
或者,做
cat file.in | sed "N;s/\n/,/" > file.out
PS 是的,可以将上面简化为
< file.in sed "N;s/\n/,/" > file.out
或者
< file.in paste -d, - - > file.out
其优点是不使用cat
.
不过我没有用过这个成语故意,为了清晰起见——它不太冗长,我喜欢cat
(猫很好)。所以请不要编辑。
或者,如果您更喜欢使用“粘贴”而不是“猫”(“粘贴”是水平连接文件的命令,而“猫”是垂直连接文件的命令),您可以使用:
paste file.in | paste -d, - -
答案2
如果有人登陆这里希望将所有行合并到 CSV 单行中,请尝试
cat file | tr '\n' ','
答案3
sed 'N;s/\n/,/' file
使用 sed,每 2 行 join(N) 一次,并将换行符 (\n) 替换为“,”。
答案4
paste -sd ',\n' file.in > file.out
另请注意,因为我们只是将一个字符替换为另一个字符(每隔一个换行符用逗号),所以我们可以就地处理输入文件:
paste -sd ',\n' file.in 1<> file.in
(但要注意,它可能无法在具有 CRLF 终止符(例如 Microsoft 的终止符)的非 Unix 系统上运行,一些模拟的 POSIXpaste
可能会以非 Unix 方式处理)