shell - Shell中的不同程序如何处理数据流中的不同列?
问题描述
假设我有一个流,其中包含三列数据,并\t
作为分隔符。
要处理流中的数据,后面的两列需要由 处理prog1
,而第一列连同prog1
(1 列) 的输出将由 处理prog2
。
prog1
:从标准输入读取数据(两列),并将其输出写入标准输出。prog2
:从标准输入读取数据(两列;一列来自原始流,另一列来自 的输出prog1
),并将其输出写入标准输出。
考虑到两者都prog1
需要prog2
启动时间,重复启动程序是不可接受的。因此,以下代码段并不能真正解决问题:
IFS='\t' # C-v tab
while read c0 c1 c2; do
paste <(echo ${c0}) <(echo -e"${c1}\t${c2}" | prog1) | prog2
done </dev/stdin
任何线索或提示将不胜感激。
解决方案
下面的东西?
# create a temporary fifo
fifo=$(mktemp -u)
mkfifo "$fifo"
# split and get first column
tee >(cut -f1 >"$fifo") |
# extract 2,3 column and pass to prog1
cut -f2,3 | prog1 |
# join with first column
paste "$fifo" - |
prog2
推荐阅读
- sql - Postgresql select max 查询需要很长时间
- pytorch - 每次迭代在所有类上使用 CNN / ResNet 进行训练/预测 - 输入数据的串联 + 匈牙利算法
- javascript - Nodejs 中基于角色的聊天系统
- javascript - 如果我检查 changeInfo.url 的值,chrome.tabs.onUpdated.addListener 不会发送消息
- arrays - 错误:在不是结构或联合的东西中请求成员“长度”
- css - 有没有办法将文本与 CSS 内容属性(chrome)中的图像垂直对齐?
- c# - ASP.NET MVC 帖子不会将值发送到 SQL 数据库
- django - 没有找到带有参数'('',)'的url的反向,但仅在特定机器上
- reactjs - 在 react js 中添加和删除一个类列表
- c++ - 是否可以在 Visual Studio 代码中制作 sln 文件?