我的输入文件
777aback66789
888gwwww6788
156fhjj88990000
999acvbbnnn788
我想根据前三个字符
对值进行排序sort -k1.3,1.3 filename
我想要排序后的最小值和最大值..
以上文件示例我想要的结果如下 156,999
我希望单行的Unix命令plc help
会发生这种情况答案 0 :(得分:3)
您可以使用cut
提取前3个字符,然后使用sort
对其进行排序,然后使用{打印第一个(1
)和最后一个($
)行{1}}:
sed
答案 1 :(得分:1)
awk
是你的朋友
awk '{first_three=substr($0,1,3)}
first_three ~ /^[[:digit:]]{1,3}/{
if(!min){min=first_three}
max = max > first_three?max:first_three;
min = min < first_three?min:first_three;
}
END{
print "Minimum : ", min
print "Maximum : ", max
}' your_file_name
示例输出
Minimum : 156
Maximum : 999
备注强>
substr($0,1,3) ~ /[[:digit:]]+/
检查前三个字符的数字。如果您的空行或不符合要求的行,则需要这样做
输入文件min
,虽然这不会有明显的原因。因此,我们将其值从我们在语句if(!min){min=first_three}
答案 2 :(得分:1)
这可以在一行中完成,但我会在此处将其格式化。
#!/usr/bin/perl
$min=-1;
$max=0;
while (<>) {
chomp;
if(($num) = /^(\d+)/) {
$max = ($num > $max) ? $num : $max;
$min = $max if($min == -1);
$min = ($num < $min) ? $num : $min;
}
}
print "$min,$max\n";
这是你的意思吗?
-E
P.S。我认为剪切和粘贴搞砸了格式化......比如它。
perl -e '$min=-1;$max=0;while (<>) {chomp;if(($num) = /^(\d+)/) { $max = ($num > $max) ? $num : $max; $min = $max if($min == -1); $min = ($num < $min) ? $num : $min;} } print "$min,$max\n";'
答案 3 :(得分:1)
sort
将使用-k
选项和正确的F[.C],F[.C]
选项执行您需要的所有操作。在你的情况下
$ sort -k1.1,1.3 < dat/sortfile.txt ## simple redirection of file to sort
156fhjj88990000
777aback66789
888gwwww6788
999acvbbnnn788
F[.C],F[.C]
1.1,1.3
以上(1.1
字段1
- 1st-char
)到(1.3
字段{{ 1}} - 1
)。
一旦3rd-char
按照您期望的方式行事,您只需在脚本中用几行来从每行的开头找到3位sort
,例如
max/min
示例使用/输出
#!/bin/bash
declare -i min=1000
declare -i max=-1000
while read -r line; do
[ "${line:0:3}" -gt "$max" ] && max=${line:0:3}
[ "${line:0:3}" -lt "$min" ] && min=${line:0:3}
done < <(sort -k1.1,1.3 < "${1-/dev/stdin}") ## process substitution feeds loop
printf "min : %d\nmax : %d\n" "$min" "$max"
示例使用 $ bash minmax.sh dat/sortfile.txt
min : 156
max : 999
stdin
最后,如果你想把它全部作为一个命令行,那么你可以这样做:
$ printf "777aback66789\n888gwwww6788\n156fhjj88990000\n999acvbbnnn788\n" | \
bash minmax.sh
min : 156
max : 999