对文件的每一行上的制表符分隔数字进行排序

时间:2015-06-30 21:45:20

标签: linux bash

我正在尝试单独对文件的每一行上的数字进行排序。一行中的数字由制表符分隔。 (我使用的是空格,但它们实际上是标签。)

例如,对于以下输入

5 8 7 6 
1 5 6 8
8 9 7 1

所需的输出是:

5 6 7 8
1 5 6 7
1 7 8 9

到目前为止,我的尝试是:

let i=1
while read line
do
    echo "$line" | tr "    " "\n" | sort -g
    cut -f $i fileName | paste -s >> tempFile$$
    ((++i))
done < fileName

5 个答案:

答案 0 :(得分:3)

这是我得到的最好的 - 我确信它可以使用awk / sed / perl以6个字符完成:

while read line
do
  echo $(printf "%d\n" $line | sort -n) | tr ' ' \\t >> another-file.txt
done < my-input-file.txt

答案 1 :(得分:1)

使用一些特定于GNU awk的功能:

$ awk 'BEGIN{ PROCINFO["sorted_in"] = "@ind_num_asc" }
      { delete(a); n = 0; for (i=1;i<=NF;++i) a[$i]; 
        for (i in a) printf "%s%s", i, (++n<NF?FS:RS) }' file
5 6 7 8
1 5 6 8
1 7 8 9

每个字段都设置为数组a中的键。在GNU awk中,可以指定for (i in a)循环遍历数组的顺序 - 在这里,我按照数字升序设置它。

答案 2 :(得分:0)

这是一个可以执行此操作的bash脚本。它需要一个文件名参数或读取标准输入,在CentOS上测试并假设IFS = $&#39; \吨\ n&#39;

#!/bin/bash

if [ "$1" ] ; then exec < "$1" ; fi

cat - | while read line
do   
  set $line
  echo $(for var in "$@"; do echo $var; done | sort -n) | tr " " "\t" 
done

如果要将输出放在另一个文件中,请将其运行为:

cat input_file | sorting_script&gt; another_file

sorting_script input_file&gt;另一个文件

答案 3 :(得分:0)

考虑使用perl

perl -ape '@F=sort @F;$_="@F\n"' input.txt

此处-a启用自动字段拆分(如awk一样)到数组@F,-p使其执行每行的脚本并打印$_每个time,-e直接在命令行上指定脚本。

不是6个字,我害怕,肖恩。

这应该在awk中很简单,但它并不具备所需的功能。如果有一个数组$@对应于字段$1$2等,那么解决方案就是awk '{asort $@}' input.txt,但遗憾的是没有这样的数组退出。将字段移动到一个数组中并从中移出它所需的循环使其比bash版本更长:

awk '{for(i=1;i<=NF;i++)a[i]=$i;asort(a);for(i=1;i<=NF;i++)printf("%s ",a[i]);printf("\n")}' input.txt

所以awk不适合这里的工作。 sort本身没有开关来控制其排序方向也有点奇怪。

答案 4 :(得分:0)

使用$ cat file 5 8 7 6 1 5 6 8 8 9 7 1 $ awk '{c=1;while(c!=""){c=""; for(i=1;i<NF;i++){n=i+1; if($i>$n){c=$i;$i=$n;$n=c}}}}1' file 5 6 7 8 1 5 6 8 1 7 8 9

awk '{
      c=1
      while(c!="")
      {
         c="" 
         for(i=1;i<NF;i++)
         {
            n=i+1
            if($i>$n)
            {
              c=$i
              $i=$n
              $n=c
            }
         }
      }
    }1
   ' file

更好的可读版本

ksh

如果你有#!/usr/bin/env ksh while read line ; do set -s +A cols $line echo ${cols[*]} done < "input_file" ,可以试试这个

[akshay@localhost tmp]$ cat test.ksh
#!/usr/bin/env ksh

cat <<EOF | while read line ; do set -s +A  cols $line; echo ${cols[*]};done
5 8 7 6 
1 5 6 8
8 9 7 1
EOF

[akshay@localhost tmp]$ ksh test.ksh
5 6 7 8
1 5 6 8
1 7 8 9

<强>测试

TBitmapImage.Create(WizardForm)