Unix 在命令中管道输入流的某个字段,并粘贴回结果
假设我有一个输入流,由分隔成一定数量字段的行组成。我想剪切各个字段,将某个字段(或多个字段)通过管道传输到程序(假定每个输入行返回一行),并保留其他字段不变,然后将结果粘贴到一起。我可能可以想象复杂的解决方案,但应该有一个干净自然的方法来做到这一点 作为一个具体的例子,假设我有一个程序,生成以下形式的行:Unix 在命令中管道输入流的某个字段,并粘贴回结果,unix,pipe,paste,cut,Unix,Pipe,Paste,Cut,假设我有一个输入流,由分隔成一定数量字段的行组成。我想剪切各个字段,将某个字段(或多个字段)通过管道传输到程序(假定每个输入行返回一行),并保留其他字段不变,然后将结果粘贴到一起。我可能可以想象复杂的解决方案,但应该有一个干净自然的方法来做到这一点 作为一个具体的例子,假设我有一个程序,生成以下形式的行: $ inputprog <a> hello world! <b> hi everyone! <a> hi! $inputprog 你好,世界! 大家好!
$ inputprog
<a> hello world!
<b> hi everyone!
<a> hi!
$inputprog
你好,世界!
大家好!
你好
假设我想把消息放在大写,而第一个字段保持不变。以下是我的想象:
$ inputprog | program -d' ' -f2- "tr a-z A-Z"
<a> HELLO WORLD!
<b> HI EVERYONE!
<a> HI!
$inputprog |程序-d'-f2-“tr a-z a-z”
你好,世界!
大家好!
你好
我正在寻找一种合理的方法来近似程序
。(我对特定于此示例的解决方案不感兴趣。)
提前感谢您的帮助
awk
可以做你想做的事。例如:
$ echo "field1 field2" | awk '{$2 = toupper($2); print;}'
field1 FIELD2
非常接近你想要做的事情<代码>$2=toupper$2更改第二个字段,而打印
打印整个(修改的)行
然而,您在如何定义“字段”时遇到了一个问题。在上面的示例中,字段用空格分隔(可以用类似的方式将字段分隔符更改为任意的ReXEP:<代码> -F′<代码> -这将被视为字段分隔符)。
但在您的示例中,您似乎要查看(awk字符串函数)和(awk 1行程序)以了解更多信息
顺便说一句,您还可以通过在除第一个字段(NF==字段数)之外的所有字段上循环来实现上述特定示例:
$echo“你好,世界!
大家好!
嗨
awk'{for(i=2;我感谢您的详细回复!我知道sed
和awk
,但我确实需要将该字段导入到一个外部程序中,用于我所拥有的用例。toupper()
适用于这种简单的情况,但awk
内置功能不足以满足我的需要。然而,awk
似乎具有将字段导入外部命令的功能,我可能可以使用它来完成我想要的任务。谢谢你给我这个想法!:-)
$ echo "<a> hello world!
<b> hi everyone!
<a> hi" |
awk '{for(i=2;i<=NF;++i) { $i=toupper($i); }; print;}'
<a> HELLO WORLD!
<b> HI EVERYONE!
<a> HI