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

Posted

技术标签:

【中文标题】bash 中的 awk 命令:如何停止添加新行?【英文标题】:awk command in bash: how to stop new line being added? 【发布时间】:2021-10-11 12:25:54 【问题描述】:

我有多个 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 做太多研究。 任何帮助表示赞赏。

【问题讨论】:

你能用printf代替print吗? printf("%s %s %s", $1, $2, $3);大概 $1 等。是行输入中的字段,而不是前三行输入。 您发布的脚本不可能产生您所说的输出,并且您显然已经编写它期望:-separated 输入并在您的shell 时产生,-separated 输出脚本不会在其输出中打印任何 :s,并且您的预期输出是 |-separated 并且具有输入或 awk 脚本中不存在的标题行。请edit您对输入/输出/代码的问题相互之间都有意义,因此我们可以为您提供最好的帮助。 我看到你接受了你得到的第一个答案,它产生了你期望的输出,从而阻止其他人发布答案,所以如果有更好的答案,你可能永远不会听说它。从一些样本输入中获得预期输出是寻找答案的起点,而不是终点。通常最好在发布问题后几个小时或一天后接受答案,这样您就可以知道可能的答案并选择最好的答案,而不是仅仅假设您得到的第一个答案是最好的答案(它可能在这种情况下,idk)。 顺便说一句,ls is useless. 【参考方案1】:

你需要在写一行输出之前积累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 允许您单个操作中消耗更多的输入行。

【讨论】:

【参考方案2】:

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

for i in script_B*
do
  "$i" | xargs -L3 
done 

虽然这不是这个技巧的最佳应用(当您尝试输入逗号时它很容易中断),但我发现它非常有助于当我正在寻找结果并且它们到达两条不同的行时。例如:

command | grep -e "IP|status" | xargs -L2 

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

for i in script_B*
do
  "$i" | xargs -L3 
done  | tr " " ","

【讨论】:

paste - - - 也是合适的。

以上是关于bash 中的 awk 命令:如何停止添加新行?的主要内容,如果未能解决你的问题,请参考以下文章

kafka深度研究之路-kafka 与zk 集群启停脚本

在 BASH 脚本中使用“awk”将列添加到 CSV 文件的末尾

如何在单个 ssh 命令中使用 bash $(awk)?

如何在 ssh / 远程 bash 命令中转义单引号字符?

在Bash中为管道中的多行变量添加双引号

实时打印使用 Python 中的子进程启动的 bash 命令的结果