gpt4 book ai didi

grep - 需要对多个字符串的第一次出现进行 grep

转载 作者:行者123 更新时间:2023-12-04 15:35:19 32 4
gpt4 key购买 nike

我试图返回多个字符串的第一次出现,即,我想从以下文本中选择第一次出现 1259、3009 和 1589 的行。

ADWN    1259    11:00   B23

ADWN 3009 12:00 B19

DDWN 723 11:30 B04

ADWN 1589 14:20 B12

ADWN 1259 11:10 B23

DDWN 2534 13:00 B16

ADWN 3009 11:50 B14

这给了我所有匹配项:
grep '1259\|3009\|1589'  somelog.log

这给了我第一场比赛
grep -m 1  '1259\|3009\|1589'  somelog.log

我想返回以下内容:
ADWN    1259    11:00   B23

ADWN 3009 12:00 B19

ADWN 1589 14:20 B12

我认为创建一个具有所需值的文件,然后循环遍历该文件,将每个数字单独传递到 grep 命令中将给我我正在寻找的东西,但我还没有找到这样的例子。是否有一个简单的解决方案,循环是处理此问题的最佳方法,还是已在其他地方回答了此示例?

在此先感谢您的想法和建议--

克莱德

最佳答案

使用 awk 的一种方式:

awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt

结果:
ADWN    1259    11:00   B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12

编辑:

我真的应该养成先阅读整个问题的习惯。我看到您正在考虑使用您想要找到第一次出现的值创建一个文件。将这些放在名为 values.txt 的文件中每行一个值。例如;这是 values.txt的内容:
1259
3009
1589

然后运行这个:
awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt

结果:
ADWN    1259    11:00   B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12

第一条命令解释:

如果第二列 ( $2 ) 等于列出的三个值之一,如果它不在数组中,则将其添加到数组中。 awk默认打印整行。

第二条命令解释:
FNR是相对于当前输入文件的记录数。 NR是记录总数。
FNR==NR { ... }构造仅适用于第一个输入文件。所以对于 values.txt 中的每一行,我们将整行( $0 )添加到一个数组(我称之为数组,但你可以给它另一个名字)。 next部队 awk阅读 values.txt 中的下一行(并跳过处理命令的其余部分)。当 FNR==NR不再为真,则读取参数列表中的第二个文件。然后我们检查数组中的第二列( $2 ),如果它在那里,打印它并将其从数组中删除。通过使用 delete我们基本上将最大计数设置为 1。

关于grep - 需要对多个字符串的第一次出现进行 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13204958/

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