我的输入文件,
777aback66789
888gwwww6788
156fhjj88990000
999acvbbnnn788
我想根据前三个字符对值进行排序,例如
sort -k1.3,1.3 filename
我想要排序后的最小值和最大值。.
示例上面的文件,我想要的结果是这样的 156,999
我希望这应该发生在单行Unix命令plc帮助
下您可以使用cut
提取前 3 个字符,然后用sort
对它们进行排序,然后打印带有sed
的第一行(1
)和最后一行($
cut -c1-3 input.txt | sort | sed -ne '1p;$p'
156
999
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:]]+/
检查前三个字符中的数字。如果您的行中有空行或不合规行,则需要这样做 输入文件- 默认情况下,新引入的变量的值为零,带有 awk。对于
min
来说,由于显而易见的原因,这行不通。因此,我们从语句中得到的第一个法定三位数值存储其值if(!min){min=first_three}
这可以在一行中完成,但我会将其格式化发布在这里。
#!/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,$maxn";
这是你的意思吗?
-E
附言我认为剪切和粘贴弄乱了格式...比如它。
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,$maxn";'
>sort
将使用-k
选项和适当的F[.C],F[.C]
选择来做你需要的一切。在您的情况下
$ sort -k1.1,1.3 < dat/sortfile.txt ## simple redirection of file to sort
156fhjj88990000
777aback66789
888gwwww6788
999acvbbnnn788
在1.1,1.3
的F[.C],F[.C]
上面说排序从(1.1
字段1
-1st-char
)到(1.3
字段1
-3rd-char
)。
一旦你sort
按照你期望的方式行事,你只需要在脚本中几行,从每行的开头找到 3 位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 : %dnmax : %dn" "$min" "$max"
示例使用/输出
$ bash minmax.sh dat/sortfile.txt
min : 156
max : 999
示例 使用来自stdin
的输入
$ printf "777aback66789n888gwwww6788n156fhjj88990000n999acvbbnnn788n" |
bash minmax.sh
min : 156
max : 999
最后,如果您希望将其全部作为单个命令行,那么您可以执行以下操作:
$ 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
< <(printf "777aback66789n888gwwww6788n156fhjj88990000n999acvbbnnn788n" |
sort -k1.1,1.3); printf "min : %dnmax : %dn" "$min" "$max"
min : 156
max : 999