我试图返回第一次出现多个字符串,即我想从下面的文本中选择第一次出现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
Run Code Online (Sandbox Code Playgroud)
这给了我所有的比赛:
grep '1259\|3009\|1589' somelog.log
Run Code Online (Sandbox Code Playgroud)
而这只给了我第一场比赛
grep -m 1 '1259\|3009\|1589' somelog.log
Run Code Online (Sandbox Code Playgroud)
我想返回以下内容:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
Run Code Online (Sandbox Code Playgroud)
我认为创建一个具有所需值的文件,然后循环遍历文件,将每个数字单独传递给grep命令将给我我想要的东西,但我还没有找到这样的例子.有没有一个简单的解决方案,循环是处理这个问题的最佳方法,还是已经在其他地方回答了这个例子?
提前感谢您的想法和建议 -
克莱德
一种使用方法awk:
awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt
Run Code Online (Sandbox Code Playgroud)
结果:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
Run Code Online (Sandbox Code Playgroud)
编辑:
我真的应该养成先阅读整个问题的习惯。我发现您正在考虑创建一个文件,其中包含您想要查找第一次出现的值。values.txt将它们放入一个名为每行一个值的文件中。例如; 这是以下内容values.txt:
1259
3009
1589
Run Code Online (Sandbox Code Playgroud)
然后运行这个:
awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt
Run Code Online (Sandbox Code Playgroud)
结果:
ADWN 1259 11:00 B23
ADWN 3009 12:00 B19
ADWN 1589 14:20 B12
Run Code Online (Sandbox Code Playgroud)
第一条命令解释:
如果第二列 ( $2) 等于列出的这三个值之一,则将其添加到数组中(如果数组中尚不存在)。awk默认打印整行。
第二条命令解释:
FNR是相对于当前输入文件的记录数。
NR是记录总数。
该FNR==NR { ... }构造仅适用于第一个输入文件。因此,对于 中的每一行values.txt,我们将整行 ( $0) 添加到一个数组(我将其称为数组,但您可以给它另一个名称)。next强制awk读取下一行values.txt(并跳过处理命令的其余部分)。当FNR==NR不再为真时,读取参数列表中的第二个文件。然后我们检查$2数组中的第二列 ( ),如果存在,则打印它并将其从数组中删除。通过使用,delete我们基本上将最大计数设置为一。