我有个问题。 假设我转储一个文件,并为foo做一个grep,结果如下:
Foo-bar-120:'foo name 1' Foo-bar-130:'foo name 2' Foo-bar-1222:'foo name 3'
等等。
我想要的是试图提取最大的数字的foo名称。 例如在这种情况下,最大的数字是1222,我期望的结果是foo name 3
有没有简单的方法使用awk和sed来实现? 而不是逐行拉出数字并循环find最大的数字?
这是我该怎么做的。 我只是在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
cat somefile | ./mycommand
。
awk代码:
awk -F[-:] '$3>a {a=$3; b=$4} END {print b}' file
$ cat文件 Foo-bar-120:'foo name 1' Foo-bar-130:'foo name 2' Foo-bar-1222:'foo name 3' $ awk -F [ - :]'$ 3> a {a = $ 3; b = $ 4} END {print b}'文件 'foo名字3'
假设行格式如“2”之前的连字符所示:
cut -d- -f3- | sort -rn | sed '1{s/^[0-9]\+://; q}'
这对你好吗?
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我喜欢字段分隔符[:-]
$ awk '{gsub(/.*:.|.$/,"")} (NR==1)||($NF>max){max=$NF; val=$0} END{print val}' file foo name 3
你不需要使用grep
。 你可以直接在你的文件中使用awk
:
awk -F"[-:]" '/Foo/ && $3>prev{val=$NF;prev=$3}END{print val}' file