首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >shell命令只处理一列

shell命令只处理一列
EN

Stack Overflow用户
提问于 2016-05-26 19:00:21
回答 2查看 137关注 0票数 0

我真的很好奇:是否有任何工具可以帮助shell文本处理程序->将一列剪掉,提供给文本处理程序,然后粘贴回去。

例如,我有一个文件:

代码语言:javascript
复制
3f27,tom,17
6d44,jack,19
139a,jerry,7

我想改变字段2,删除所有的爱雨。

我知道有很多方法可以解决这个问题。但为什么我们不面对它呢?

我想要一个工具,比如:

代码语言:javascript
复制
deal-only -d"," -f2 sed 's/[aeiou]//g'

这更干净更强大。

那么,是否有人知道这样的工具,或类似的解决方案?如果不是,我想创造一个。

正如我前面所说的,我知道sed,或者awk可以很好地处理上面的问题。但是当您遇到一个复杂的问题时,sedawk无法拯救您。

代码语言:javascript
复制
deal-only -d"," -f2 ./ip2country.rb

在这里,我想修改第2列从ip到国家。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-26 21:04:59

您可以使用bash的协同处理特性(参见这里):

代码语言:javascript
复制
#!/bin/bash

coproc stdbuf -oL sed 's/[aeiou]//g'

while IFS="," read a b c ; do
    echo "${b}" >&${COPROC[1]}
    read -u ${COPROC[0]} b2
    echo "${a},${b2},${c}"
done

一些随机的注释:

  • 这不是POSIX
  • 过滤列数据的进程的标准输出*必须*为行缓冲/非缓冲(这是stdbuf -oL部分--参见上述文档中的“缓冲”部分)。
  • (AFAIK)同样的效果可以通过产生背景过程和i/o重定向来实现。
  • (AFAIK)连接到单个外部“资源密集型”进程输入/输出的两个命名管道也应该可以工作。
  • 我不能百分之百确定这是否是最好的方法,但它确实对我有用。

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2016-05-26 19:06:57

使用awk

代码语言:javascript
复制
# script.awk
BEGIN { FS="," }
{print $1 "," gensub("[aeiou]+", "", "g", $2) "," $3}

然后:

代码语言:javascript
复制
awk -f script.awk < data.txt
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37469033

复制
相关文章

相似问题

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