gpt4 book ai didi

AWK - 如何有选择地修改txt文件

转载 作者:行者123 更新时间:2023-12-01 09:12:54 25 4
gpt4 key购买 nike

我想打印每条记录的特定第二个字段(匹配正则表达式)

awk '$2 ~ /regex1/'

但是,只有在 regex2 和 regex3 之间的特定记录

awk '/regex2/,/regex3/'

不在regex2和regex3之间的其他记录应正常打印(所有字段)

有什么想法,如何将它们组合在一起?

输入和输出的快速示例:

输入

parrot   milana  3 ukraine
dog husky 1 poland
cat husky 5 france
elephant malamut 5 belgium
bird husky 5 turkey

输出:(给我看

parrot   milana  3 ukraine
dog husky 1 poland
husky
elephant malamut 5 belgium
bird husky 5 turkey
  1. 显示整个输入但是:
  2. 在/dog/和/elephant/之间(显示这些记录不变)仅显示第二个字段,匹配正则表达式/husky/

我希望这是有用的...

最佳答案

这个:

awk '/regex2/,/regex3/'

的简写
awk '/regex2/{f=1} f; /regex3/{f=0}'

恕我直言,切勿使用速记版本,因为它的简洁性不值得在您尝试使用其他标准构建它时引入的困难,例如不打印起始行和/或不打印结束行和/或引入其他 RE 以在您现在所做的范围内进行匹配。

鉴于此,您将从这个脚本开始:

awk '/dog/{f=1} f; /elephant/{f=0}'

你只想打印你发现“husky”的行,所以这是一个简单、明显的调整:

awk '/dog/{f=1} f && /husky/; /elephant/{f=0}'

编辑:响应更改的要求,并使用制表符分隔的文件:

$ cat file
parrot milana 3 ukraine
dog husky 1 poland
cat husky 5 france
elephant malamut 5 belgium
bird husky 5 turkey

$ awk '
BEGIN{ FS=OFS="\t" }
/elephant/ {f=0}
{
if (f) {
if ($2 == "husky") {
print "", $2
}
}
else {
print
}
}
/dog/ {f=1}
' file
parrot milana 3 ukraine
dog husky 1 poland
husky
elephant malamut 5 belgium
bird husky 5 turkey

你可以写的更简洁:

$ awk '
BEGIN{ FS=OFS="\t" }
/elephant/ {f=0}
f && /husky/ { print "", $2 }
!f
/dog/ {f=1}
' file
parrot milana 3 ukraine
dog husky 1 poland
husky
elephant malamut 5 belgium
bird husky 5 turkey

但我认为 if-else 语法对于 awk 新手来说是最清晰和最容易修改的。如果您想要不同的输出格式,请在手册中查找“printf”。

关于AWK - 如何有选择地修改txt文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13864820/

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