同时使用 grep 和 awk

问题描述 投票:0回答:3

我有一个包含 4 列数字的文件 (A.txt),另一个包含 3 列数字的文件 (B.txt)。我需要解决以下问题:

  1. 查找 A.txt 中第三列包含出现在 B.txt 第三列任意位置的数字的所有行。

  2. 假设我在一个目录中有很多文件,例如 A.txt,并且我需要对该目录中的每个文件运行此命令。

我该怎么做?

bash awk grep
3个回答
40
投票

你永远不应该看到有人同时使用

grep
awk
,因为无论
grep
能做什么,你也可以在
awk
中做:

Grep 和 Awk

grep "foo" file.txt | awk '{print $1}'

仅使用 Awk:

awk '/foo/ {print $1}' file.txt

我必须把这件事从心里吐出来。现在解决你的问题...

Awk 是一种编程语言,它假设单个循环遍历一组文件中的所有行。而且,你不想这样做。相反,您希望将

B.txt
视为特殊文件并循环访问其他文件。这通常需要 Python 或 Perl 之类的东西。 (旧版本的 BASH 不处理散列键数组,因此这些版本的 BASH 将无法工作。)但是,slitvinov 看起来他找到了答案。

无论如何,这里有一个 Perl 解决方案:

use strict;
use warnings;
use feature qw(say);
use autodie;

my $b_file = shift;
open my $b_fh, "<", $b_file;

#
# This tracks the values in "B"
#
my %valid_lines;
while ( my $line = <$b_file> ) {
    chomp $line;
    my @array = split /\s+/, $line;
    $valid_lines{$array[2]} = 1;   #Third column
}
close $b_file;

#
# This handles the rest of the files
#
while ( my $line = <> ) {  # The rest of the files
   chomp $line;
   my @array = split /\s+/, $line;
   next unless exists $valid_lines{$array[2]};  # Next unless field #3 was in b.txt too
   say $line;
}

12
投票

这是一个例子。创建以下文件并运行

awk -f c.awk B.txt A*.txt 

c.awk

FNR==NR {
    s[$3]
    next
}

$3 in s {
    print FILENAME, $0
}

A1.txt

1 2 3
1 2 6
1 2 5

A2.txt

1 2 3
1 2 6
1 2 5

B.txt

1 2 3
1 2 5
2 1 8

输出应该是:

A1.txt 1 2 3
A1.txt 1 2 5
A2.txt 1 2 3
A2.txt 1 2 5

0
投票

我有一堆数据文件,我想将其格式化为以下标题域、标题、BreachDate、DataClasses、PwnCount、Description。我尝试过使用 grep|awk 但更加困惑。我想要生成一个 bash 脚本,迭代数据文件的每一行并在标题下打印数据。如果有人能提供帮助,我将不胜感激。我的一些数据是:

“名称”:“000webhost”,“标题”:“000webhost”,“域名”: “000webhost.com”,“BreachDate”:“2015-03-01”,“AddedDate”:“2015-10-26T23:35: 45Z","修改日期":"2017-12-10T21:44:27Z","PwnCount":14936670,"描述": “大约在 2015 年 3 月,免费网络托管提供商 000webhost_suffered a_major_data_breach 暴露了近 1500 万条客户记录。数据 10 月份 000webhost 收到警报之前已被出售和交易。违规行为 包括姓名、电子邮件地址和纯文本密码。","LogoPath":"https:// haveibeenpwned.com/Content/Images/PwnedLogos/000webhost.png","DataClasses": [“电子邮件地址”、“IP 地址”、“姓名”、“密码”]、“已验证”: 真,"IsFabricated":假,"IsSensitive":假,"IsRetired":假,"IsSpamList": false,"IsMalware":false,"IsSubscriptionFree":false

© www.soinside.com 2019 - 2024. All rights reserved.