shell 命令只处理一列

shell command deal with only one column

我很好奇:有没有什么工具可以辅助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修改为country。

使用awk:

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

然后:

awk -f script.awk < data.txt

您可以使用 bashcoprocess 功能(参见 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

  • 过滤列数据的过程的标准输出*必须*是行buffered/unbuffered(这是stdbuf -oL部分——参见第"Buffering"节上述文件)

  • (AFAIK) 通过生成后台进程和 i/o redirection

  • 可以实现相同的效果
  • (AFAIK) 两个命名管道链接到单个外部 "resource-heavy" 进程 input/output 也应该工作

  • 我不是 100% 确定这是否是最好的方法,但它确实对我有用

祝你好运!