shell命令只处理一列

时间:2016-05-26 19:00:22

标签: bash shell text-processing

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

例如,我有一个文件:

3f27,tom,17
6d44,jack,19
139a,jerry,7

我想要更改字段2,删除所有aeiou。

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

我想要一个工具,例如:

deal-only -d"," -f2 sed 's/[aeiou]//g'

这更干净,更强大。

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

正如我上面所说,我知道sedawk可以很好地处理上述问题。 但是当您遇到复杂问题时,sedawk无法拯救您。

deal-only -d"," -f2 ./ip2country.rb

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

2 个答案:

答案 0 :(得分:1)

使用awk

# script.awk
BEGIN { FS="," }
{print $1 "," gensub("[aeiou]+", "", "g", $2) "," $3}

然后:

awk -f script.awk < data.txt

答案 1 :(得分:0)

您可以使用bash协同处理功能(请参阅例如here):

#!/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 redirection

  • 可以达到同样的效果
  • (AFAIK)链接到单个外部“资源密集型”流程输入/输出的两个命名管道也可以正常工作

  • 我不是百分百确定这是否是最好的方法,但它对我有用

祝你好运!