我正在尝试单独对文件的每一行上的数字进行排序。一行中的数字由制表符分隔。 (我使用的是空格,但它们实际上是标签。)
例如,对于以下输入
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
答案 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)