shell 命令只处理一列



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

例如,我有一个文件:

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

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

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

我想要一个工具,例如:

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

这更干净,更强大。

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


正如我上面所说,我知道sed,或者awk可以很好地处理上述问题。但是当你遇到一个复杂的问题时,sedawk都救不了你。

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

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

使用 awk

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

然后:

awk -f script.awk < data.txt

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

#!/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) 链接到单个外部"资源密集型"进程输入/输出的两个命名管道也应该可以工作

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

祝你好运!

相关内容

  • 没有找到相关文章

最新更新