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'
这个更干净更有力。
那么,有人知道这样的工具或类似的解决方案吗?
如果没有,我想创建一个。
正如我上面所说,我知道sed
或awk
可以很好地解决上述问题。
但是当你遇到复杂的问题时,sed
或awk
都救不了你。
deal-only -d"," -f2 ./ip2country.rb
在这里,我想将第2列从ip修改为country。
使用awk
:
# script.awk
BEGIN { FS="," }
{print "," gensub("[aeiou]+", "", "g", ) "," }
然后:
awk -f script.awk < data.txt
您可以使用 bash
的 coprocess 功能(参见 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% 确定这是否是最好的方法,但它确实对我有用
祝你好运!
我很好奇:有没有什么工具可以辅助shell文本处理程序-> 剪下一栏,提供给文本处理程序,然后再粘贴回去。
比如我有一个文件:
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修改为country。
使用awk
:
# script.awk
BEGIN { FS="," }
{print "," gensub("[aeiou]+", "", "g", ) "," }
然后:
awk -f script.awk < data.txt
您可以使用 bash
的 coprocess 功能(参见 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% 确定这是否是最好的方法,但它确实对我有用
祝你好运!