我真的很好奇:有没有工具可以帮助外壳文本处理程序 ->剪掉一列,提供给文本处理程序,然后将其粘贴回去。
例如,我有一个文件:
3f27,tom,17
6d44,jack,19
139a,jerry,7
我想更改字段 2,删除所有 aeiou。
我知道有很多方法可以解决这个问题。但为什么我们不面对它呢?
我想要一个工具,例如:
deal-only -d"," -f2 sed 's/[aeiou]//g'
这更干净,更强大。
那么,有没有人知道这样的工具或类似的解决方案?如果没有,我想创建一个。
正如我上面所说,我知道sed
,或者awk
可以很好地处理上述问题。但是当你遇到一个复杂的问题时,sed
或awk
都救不了你。
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% 确定这是否是最好的方法,但它确实对我有用
祝你好运!