Linux Bash命令行合并行及生成类CSV格式输出的实现方法
嘿,我来帮你搞定这两个Bash命令行的问题~先说说行合并的常用方法,再针对性解决你那个文本转换的需求。
一、Linux Bash里的行合并操作
行合并的工具不少,看你具体需求选:
1. paste命令:简单直接的合并
这是处理行合并最省心的工具,默认用制表符分隔不同行,也能自定义分隔符:
- 合并两个文件的对应行:
paste file1.txt file2.txt - 用逗号分隔合并行:
paste -d ',' file1.txt file2.txt - 把文件里所有行合并成一行(用空格分隔):
paste -s -d ' ' file.txt
2. awk命令:灵活处理复杂逻辑
如果需要按特定规则合并(比如奇偶行合并),awk就很顺手:
awk 'NR%2==1{line=$0} NR%2==0{print line "," $0}' file.txt
这段代码会把第1行和第2行合并、第3行和第4行合并,中间用逗号隔开。
3. sed命令:轻量的行合并
sed适合简单的行合并场景,比如把每两行合并成一行:
sed 'N;s/\n/ /' file.txt
N是把下一行读进来,s/\n/ /是把换行符换成空格。
二、把指定输入转换成类CSV格式
针对你给的输入:app1 version 1 app2 version 1 version 2 version 3,要得到app1,1 app2,1 app2,2 app2,3,用awk就能轻松实现,核心思路是跟踪当前的应用名称,遇到version就把后面的版本号和当前应用配对输出。
直接在命令行跑这段代码就行:
echo "app1 version 1 app2 version 1 version 2 version 3" | awk '{ current_app = "" for (i=1; i<=NF; i++) { if ($i ~ /^app/) { current_app = $i } else if ($i == "version") { i++ # 跳过"version",直接取后面的版本号 printf "%s,%s ", current_app, $i } } print "" # 最后补个换行,让输出更清爽 }'
执行后就能得到你想要的结果啦~
如果输入是来自文件(比如input.txt),直接把文件名传给awk就行:
awk '{ current_app = "" for (i=1; i<=NF; i++) { if ($i ~ /^app/) { current_app = $i } else if ($i == "version") { i++ printf "%s,%s ", current_app, $i } } print "" }' input.txt
内容的提问来源于stack exchange,提问作者Khaled
相关产品推荐
相关产品推荐

