排序和打印成行

时间:2014-08-13 13:36:24

标签: awk

输入:

54578787 -58    1
6578999 -658-   3
1352413 -541-   11
4564564 -23-    11
654564  -65-    3
6543564 -65-    1

期望的输出:

column3 = 1,3,11

使用:

a=$(awk '{print $3}' text | sort -u | paste -s -d,) && paste <(echo "column3 =") <(echo $a)

我只得到:

column3 = [large blank] 1,11,3

其他问题:如果我删除第二列上的所有连字符,我会

column3 = [large blank] ,1,11,3

我认为这是一个粘贴命令问题。

最后但并非最不重要:我为什么要1,11,3代替1,3,11

5 个答案:

答案 0 :(得分:2)

我只想使用awk:

$ awk '{a[$3]} END {printf "column3 = "; for (i in a) {printf "%d%s", i, (++v==length(a)?"\n":",")}}' file
column3 = 1,3,11

解释

  • a[$3]使用第3列填充a[]数组。这样,任何新值都将创建一个新索引。
  • END {}在处理完整个文件后执行命令。
  • printf "column3 = "打印"column3 ="
  • for (i in a) {printf "%d%s", i, (++v==length(a)?"\n":",")}循环存储的值并以逗号分隔打印,除非它是最后一个。

您当前的解决方案是这样的:

$ paste -d" " <(echo "column3 =") <(awk '{print $3}' file | sort -u | paste -s -d,)
column3 = 1,11,3

请注意,无需存储在$a中。要只有一个空格,请使用paste -d" "

并按数字排序?只需将-n添加到sort

即可
$ paste -d" " <(echo "column3 =") <(awk '{print $3}' file | sort -nu | paste -s -d,)
column3 = 1,3,11

使用此命令可以获得相同的输出,无论连字符。

答案 1 :(得分:1)

您可以执行类似

的操作
 echo "column3 = $(awk '{print $3}' test.txt |sort -nu |  paste -s -d, )"

给了我

column3 = 1,3,11

一个关键要素是使用-n选项进行排序以进行数字排序。


它也适用于删除的连字符:

echo "column3 = $(tr -d - < test.txt| awk '{print $3}'  |sort -nu |  paste -s -d, )"

还输出

column3 = 1,3,11

答案 2 :(得分:1)

如果perl可以接受:

perl -lanE '
    $c3{$F[2]} = 1; 
    END {say "column3 = ", join(",", sort {$a <=> $b} keys %c3)}
' file

答案 3 :(得分:0)

我的gawk线看起来像:

awk '{a[$3]} END{c=asorti(a,d,"@val_num_asc"); printf "column3 = ";
     for(x=1;x<=c;x++)printf "%d%s", d[x],(c==x?"\n":",")}' file

输出:

column3 = 1,3,11

注意

  • 你需要gawk来运行(asorti功能)
  • 按数字排序升序
  • 单行输出。

答案 4 :(得分:0)

假设您确实希望对数字进行排序,而不是按照它们首次出现的顺序进行复制:

$ awk '{print $3}' file | sort -nu | awk '{s=(NR>1?s",":"")$0} END{print "column3 =",s}'
column3 = 1,3,11

您收到1,11,3因为-n没有sort arg,您按字母顺序排序而不是数字排序11的第一个字符(即1 )来自3的第一个字符。