如何在sed或awk中结合stdin和file进行格式化输出?

如何在sed或awk中结合stdin和file进行格式化输出?,awk,sed,Awk,Sed,我需要找到一行代码,我认为SED或AWK将是最好的工具,以获取两个输入(一个stdin,一个文件),并将它们组合起来,将一个格式化行输出到stdout 标准数据:20170607233000 wind0 180 1 2 3 文件数据:270 所需输出:270 1 2 3 (将180替换为270 from文件,删除时间戳和wind0“name”) 我有一行代码: awk ‘ { printf "%d %d %d %d", $7, $4, $5, $6 }’ - heading.txt 但它处理s

我需要找到一行代码,我认为SED或AWK将是最好的工具,以获取两个输入(一个stdin,一个文件),并将它们组合起来,将一个格式化行输出到stdout

标准数据:
20170607233000 wind0 180 1 2 3

文件数据:
270

所需输出:
270 1 2 3
(将180替换为270 from文件,删除时间戳和wind0“name”)

我有一行代码:

awk ‘ { printf "%d %d %d %d", $7, $4, $5, $6 }’ - heading.txt
但它处理stdin和heading.txt以及独立的输入,并提供两个输出

我还发现了这个代码示例,它接近我想要的,但我不知道如何格式化/重新排序输出:

awk ’FNR==NR { a[FNR""] = $0; next } { print a[FNR""], $0 }'


这里是你关心的背景:这是一个坐在(大型)船上的气象站。风向总是相对于船只报告,通常是向北报告,但这并不准确。船以一个锚点为支点,始终面向风。我有一个磁强计(指南针)挂在RaspberryPi上,RaspberryPi是气象站,它可以读取船所面对的航向,并通过cron将其写入文件。这使得船在一个巨大的风向标。我需要从文件中获取航向数据,并用“真实”值替换风向。气象站代码非常好,允许我基于其他仪表创建“虚拟”仪表,并通过cgi脚本插入代码。限制是代码必须是一行,可以在linux shell中执行,并通过stdout返回数据。

除非将stdin称为
-
/dev/stdin
,否则无法从stdin和文件中读取数据。因此,首先从
文件中读取值并将其存储到var中。然后从stdin和
中读取数据输出:

$ echo 20170607233000 wind0 180 1 2 3 | awk 'NR==FNR{b=$1;next}{print b, $4,$5,$6}' file -
270 1 2 3

除非将stdin称为
-
/dev/stdin
,否则无法从stdin和文件中读取,因此首先从
文件中读取值,并将其存储到变量中。然后从stdin中读取数据并输出:

$ echo 20170607233000 wind0 180 1 2 3 | awk 'NR==FNR{b=$1;next}{print b, $4,$5,$6}' file -
270 1 2 3

使用
sed
的简单解决方案:

echo "20170607233000 wind0 180 1 2 3" | sed 'N;s/\n.*180//;' file -

使用
sed
的简单解决方案:

echo "20170607233000 wind0 180 1 2 3" | sed 'N;s/\n.*180//;' file -

无论是谁编写了包含[FNR”“]
的代码示例,都对awk语法和语义感到非常困惑,忘了你曾经见过它吧。请注意您的引用,顺便说一句-
不是
。无论是谁编写了包含
a[FNR”“]
的代码示例,都对awk语法和语义感到非常困惑,请忘记您曾经见过它。请注意您的报价,顺便说一句-
不是
。这非常有效,谢谢。如果您想看到实际的结果:酷,实际的生产解决方案。通常只是某人的家庭作业。看看那个风向图,也许你应该形成一个趋势图,把它放在中间,并画出它的尺度。现在风是从北方吹来的,上面和下面都是点。这非常有效,谢谢。如果您想看到实际的结果:酷,实际的生产解决方案。通常只是某人的家庭作业。看看那个风向图,也许你应该形成一个趋势图,把它放在中间,并画出它的尺度。现在风来自北方,点在顶部和底部。这非常接近,但仍然遇到同样的问题,输出在两行而不是一行。我最终使用了下面詹姆斯·布朗答案中的代码。谢谢您的帮助。@mikeo您的文件似乎以一个换行结束,但您没有指定。这非常接近,但仍然遇到了同样的问题,输出是两行而不是一行。我最终使用了下面詹姆斯·布朗答案中的代码。谢谢您的帮助。@mikeo您的文件似乎以换行符结尾,您没有指定换行符。