4

我有个问题。假设我转储一个文件并对 foo 执行 grep 并得出如下结果:

foo-bar-120:'foo 名称 1'
foo-bar-130:'foo 名称 2'
foo-bar-1222:'foo 名称 3'

等等。

我想要的只是尝试提取具有最大数字的 foo 名称。例如在这种情况下,最大的数字是 1222,我期望的结果是foo name 3

有没有一种简单的方法使用 awk 和 sed 来实现这一点?而不是逐行拉出数字并循环查找最大数字?

4

6 回答 6

3

的代码:

awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file

$猫文件
foo-bar-120:'foo 名称 1'
foo-bar-130:'foo 名称 2'
foo-bar-1222:'foo 名称 3'

$ awk -F[-:] '$3>a {a=$3; b=$4} END {打印 b}' 文件
'富名 3'
于 2013-07-24T21:26:50.510 回答
1

假设行格式如图所示,“数字”前有 2 个连字符:

cut -d- -f3- | sort -rn | sed '1{s/^[0-9]\+://; q}'
于 2013-07-24T21:10:19.743 回答
1

你可以吗?

awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}'

使用您的数据:

kent$  echo "Foo-bar-120:’foo name 1’
Foo-bar-130:’foo name 2’
Foo-bar-1222:’foo name 3’"|awk -F'[:-]' '{n=$(NF-1);if(n>m){v=$NF;m=n}}END{print v}'
’foo name 3’

PS我喜欢字段分隔符[:-]

于 2013-07-24T21:10:49.870 回答
1

这就是我将如何做到的。我刚刚在 Cygwin 中测试了这个。希望它也能在 Linux 下工作。将其放入文件中,例如mycommand

#!/usr/bin/awk -f

BEGIN {
        FS="-";
        max = 0;
        maxString = "";
}

{
        num = $3 + 0; # convert string to int
        if (num > max) {
                max = num;
                split($3, arr, "'");
                maxString = arr[2];
        }
}

END {
        print maxString;
}

然后使文件可执行(chmod 755 mycommand)。现在,您可以通过键入任何您想要的内容,例如,cat somefile | ./mycommand.

于 2013-07-24T21:11:19.640 回答
1
$ awk '{gsub(/.*:.|.$/,"")} (NR==1)||($NF>max){max=$NF; val=$0} END{print val}' file
foo name 3
于 2013-07-25T08:59:09.423 回答
0

你不需要使用grep. 您可以awk直接在您的文件上使用:

awk -F"[-:]" '/Foo/ && $3>prev{val=$NF;prev=$3}END{print val}' file
于 2013-07-24T21:19:26.117 回答