如何在sed或awk中将stdin和文件组合为格式化输出?

时间:2017-06-08 06:40:29

标签: awk sed

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

stdin数据:20170607233000 wind0 180 1 2 3

档案数据:270

需要输出:270 1 2 3 (用文件中的270替换180,删除时间戳和wind0"名称")

我有这行代码:

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,它是气象站,读取船面向的标题,并通过cron将其写入文件。这使得船进入一个巨大的风向标。我需要从文件中获取标题数据,并用" real"替换风向。值。气象站代码非常好,可以让我创建一个虚拟的"测量基于其他仪表并通过cgi脚本插入代码。限制是代码必须是一行,可以在linux shell中执行并通过stdout返回数据。

2 个答案:

答案 0 :(得分:0)

除非您将标准输入引用为-/dev/stdin,否则您无法从标准输入和文件中读取,因此请首先读取file中的值并将其存储到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

答案 1 :(得分:0)

使用sed的简单解决方案:

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