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

时间:2017-04-20 02:38:32

标签: shell unix ksh

我的输入文件

777aback66789

888gwwww6788

156fhjj88990000

999acvbbnnn788

我想根据前三个字符

对值进行排序
sort -k1.3,1.3 filename 

我想要排序后的最小值和最大值..

以上文件示例我想要的结果如下 156,999

我希望单行的Unix命令plc help

会发生这种情况

4 个答案:

答案 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:]]+/检查前三个字符的数字。如果您的空行或不符合要求的行,则需要这样做 输入文件
  • 默认情况下,新引入的变量与awk的值为零。对于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