gpt4 book ai didi

bash - 使用 grep 或 sed 即时复制和修改复杂的行

转载 作者:行者123 更新时间:2023-11-29 09:21:32 24 4
gpt4 key购买 nike

有没有办法用 grep 或 sed 执行以下操作:读取文件的每一行,复制两次并修改每个副本:

原行:

X Y Z
A B C

新行:

Y M X
Y M Z
B M A
B M C

其中X、Y、Z、M都是整数,M是一个固定的整数(即2)我们边复制边注入(inject)!我想解决方案(如果有的话)会非常复杂,以至于人们(包括我)看到它后会开始流血!

最佳答案

$ awk -v M=2 '{print $2,M,$1; print $2,M,$3;}' file
Y 2 X
Y 2 Z
B 2 A
B 2 C

工作原理

  • -v M=2

    这定义了变量 M 的值为 2。

  • 打印 $2,M,$1

    这会打印第二列,然后是 M,然后是第一列。

  • 打印 $2,M,$3

    这将打印第二列,然后是 M,然后是第三列。

扩展版

假设我们要处理任意数量的列,我们打印第一个和最后一个之间的所有列,然后是 M,然后是第一个,然后打印第一个和最后一个之间的所有列,然后是 M,然后是最后。在这种情况下,使用:

awk -v M=2 '{for (i=2;i<NF;i++)printf "%s ",$i; print M,$1; for (i=2;i<NF;i++)printf "%s ",$i; print M,$NF;}' file

例如,考虑这个输入文件:

$ cat file2
X Y1 Y2 Z
A B1 B2 C

以上产生:

$ awk -v M=2 '{for (i=2;i<NF;i++)printf "%s ",$i; print M,$1; for (i=2;i<NF;i++)printf "%s ",$i; print M,$NF;}' file2
Y1 Y2 2 X
Y1 Y2 2 Z
B1 B2 2 A
B1 B2 2 C

代码的关键变化是添加了以下命令:

for (i=2;i<NF;i++)printf "%s "

此命令打印从 i=2 开始的所有列,这是第一个 afteri=NF-1 的列最后一列之前。代码在其他方面是相似的。

关于bash - 使用 grep 或 sed 即时复制和修改复杂的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29982998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com