首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash中的awk命令:如何停止添加新行?

bash中的awk命令:如何停止添加新行?
EN

Stack Overflow用户
提问于 2021-08-06 15:56:01
回答 2查看 49关注 0票数 1

我有多个bash代码文件,每行有3-4行(如下所示)。

代码语言:javascript
复制
#!/bin/bash
echo "xy"
echo "x.com"
echo "z"

我希望输出csv文件如下(每个文件的输出在csv文件的一行中)

代码语言:javascript
复制
|name|sit|alternate_name
|:----|:----:|----|
|x|x.com|z
|y|y.com|f

但我得到的输出就像-

代码语言:javascript
复制
||
|:----:|
|x|
|x.com|
|z|
|y|
|y.com|
|f|

我的代码如下-

代码语言:javascript
复制
for i in $(ls script_B*)
do
    ./$i | awk -F ':' '{OFS=",";print $1,$2,$3}' >> output.csv
done 

我是这方面的一个菜鸟,对awk的研究不多。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-06 16:02:21

在编写输出行之前,您需要积累3行输入,如下所示

代码语言:javascript
复制
$ 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行文件,则可以将其简化为

代码语言:javascript
复制
% 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的版本允许您在单个操作中使用更多的输入行。

票数 1
EN

Stack Overflow用户

发布于 2021-08-06 17:06:14

我发现xargs -L在这方面也是有帮助的:

代码语言:javascript
复制
for i in script_B*
do
  "$i" | xargs -L3 
done 

虽然这不是这个技巧的最佳应用(当您尝试在其中放置逗号时,它很容易中断),但我发现当我正在寻找结果时,它们会出现在两条不同的行上,这是非常有帮助的。例如:

代码语言:javascript
复制
command | grep -e "IP|status" | xargs -L2 

无论如何,回到您的问题,您可以在输出中添加逗号,但它并不可靠,因为如果您的任何脚本生成带有空格的行,它就会中断:

代码语言:javascript
复制
for i in script_B*
do
  "$i" | xargs -L3 
done  | tr " " ","
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68684460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档