bash - bash 中的 awk 命令:如何停止添加新行?
问题描述
我有多个 bash 代码文件,每个文件有 3-4 行(如下所示)。
#!/bin/bash
echo "xy"
echo "x.com"
echo "z"
我想要输出 csv 文件,如下所示(每个文件的输出在一行 csv 文件中)
|name|sit|alternate_name
|:----|:----:|----|
|x|x.com|z
|y|y.com|f
但我得到的输出像 -
||
|:----:|
|x|
|x.com|
|z|
|y|
|y.com|
|f|
我的代码如下 -
for i in $(ls script_B*)
do
./$i | awk -F ':' '{OFS=",";print $1,$2,$3}' >> output.csv
done
我是这方面的菜鸟,不能对 awk 做太多研究。任何帮助表示赞赏。
解决方案
在编写一行输出之前,您需要累积 3 行输入,例如
$ awk -F: 'BEGIN {OFS=","} NR % 3 == 1 {line1=$0} NR % 3 == 2 {line2=$0} NR % 3 == 0 { print line1, line2, $0 }' <<EOF
x
x.com
z
EOF
x,x.com,z
NR
是当前输入行的编号(从 1 开始)。计算余数模 3 会告诉您您是在输入组的第一行、第二行还是第三行。如果每个awk
人只读取一个 3 行文件,您可以将其简化为
% awk -F: 'BEGIN {OFS=","} NR == 1 {line1=$0} NR == 2 {line2=$0} NR == 3 { print line1, line2, $0 }' <<EOF
x
x.com
z
EOF
x,x.com,z
在前两种情况下,您必须使用变量记住当前行,直到awk
读取最后一行;我不知道有一个版本awk
允许您在单个操作中使用更多行输入。
推荐阅读
- java - SQLite的简单select语句耗时2秒以上
- virtualization - WinNAT服务启动失败
- ruby-on-rails - Ruby on Rails - 从 has_and_belongs_to 访问子关系
- sql - 平均查询 ORA-00936 错误
- java - 我可以将 2 个线程的操作与空锁对象同步吗?
- windows - UWP console app with no icon, just execution alias
- css - 雅虎邮件的 css 解析器从 html 中删除 box-sizing,如何解决这个问题?
- java - 删除 JetInstance 作业
- javascript - 每个实例是否都会创建一个新方法,该方法在构造函数中定义?
- drools - 可执行模型规则的运行时创建和持久性