Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在命令中管道输入流的某个字段,并粘贴回结果_Unix_Pipe_Paste_Cut - Fatal编程技术网

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