如何在没有分隔符的情况下对文件进行排序并提取最小值和最大值



我的输入文件,

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.3F[.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

相关内容

  • 没有找到相关文章