Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk 按行排序和打印_Awk - Fatal编程技术网

Awk 按行排序和打印

Awk 按行排序和打印,awk,Awk,输入: 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 期望输出: 54578787 -58 1 6578999 -658- 3 1352413 -541- 11 4564564 -23- 11 654564 -65- 3 6543564 -65

输入:

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
期望输出:

54578787 -58    1
6578999 -658-   3
1352413 -541-   11
4564564 -23-    11
654564  -65-    3
6543564 -65-    1
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
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 = [large blank] 1,11,3
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
我认为这是一个粘贴命令问题

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

最后但并非最不重要的一点:为什么我用
1,11,3
而不是
1,3,11

你可以这样做

column3 = [large blank] ,1,11,3
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
给我

 echo "column3 = $(awk '{print $3}' test.txt |sort -nu |  paste -s -d, )"
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
一个关键元素是使用
-n
选项进行数字排序

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
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 = [large blank] ,1,11,3
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
给我

 echo "column3 = $(awk '{print $3}' test.txt |sort -nu |  paste -s -d, )"
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
一个关键元素是使用
-n
选项进行数字排序

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
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
我会使用awk:

column3 = 1,3,11
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
解释
  • a[$3]
    用第三列填充
    a[]
    数组。这样,任何新值都将创建一个新索引
  • END{}
    处理整个文件后执行命令
  • printf“column3=“
    打印
    ”column3=“
  • 对于a{printf“%d%s”,i,(++v==长度(a)“\n”:“,”)中的(i)
    循环遍历存储的值并以逗号分隔打印,除非它是最后一个值

您当前的解决方案的工作原理如下:

$ awk '{a[$3]} END {printf "column3 = "; for (i in a) {printf "%d%s", i, (++v==length(a)?"\n":",")}}' file
column3 = 1,3,11
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
使用此命令,无论连字符是什么,您都会得到相同的输出。

我只使用awk:

column3 = 1,3,11
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
解释
  • a[$3]
    用第三列填充
    a[]
    数组。这样,任何新值都将创建一个新索引
  • END{}
    处理整个文件后执行命令
  • printf“column3=“
    打印
    ”column3=“
  • 对于a{printf“%d%s”,i,(++v==长度(a)“\n”:“,”)中的(i)
    循环遍历存储的值并以逗号分隔打印,除非它是最后一个值

您当前的解决方案的工作原理如下:

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

使用此命令,无论连字符是什么,您都会得到相同的输出。

我的gawk行如下所示:

$ paste -d" " <(echo "column3 =") <(awk '{print $3}' file | sort -nu | paste -s -d,)
column3 = 1,3,11
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
  • 你需要gawk来运行它(asorti函数)
  • 按数字升序排序
  • 单行输出

我的呆滞线条看起来像:

$ paste -d" " <(echo "column3 =") <(awk '{print $3}' file | sort -nu | paste -s -d,)
column3 = 1,3,11
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
  • 你需要gawk来运行它(asorti函数)
  • 按数字升序排序
  • 单行输出
如果可以接受perl:

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
perl-lanE'
$c3{$F[2]}=1;
结束{say“column3=,join(,”,排序{$a$b}键%c3)}
"档案"
如果可以接受perl:

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
perl-lanE'
$c3{$F[2]}=1;
结束{say“column3=,join(,”,排序{$a$b}键%c3)}
"档案"

假设您确实希望对数字进行排序,而不仅仅是按照第一次看到的顺序进行复制:

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

您得到的是
1,11,3
,因为如果没有
sort
-n
参数,您将按字母顺序排序,而不是按数字和
11
的第一个字符排序(即
1
)位于
3

的第一个字符之前,假设您确实希望对数字进行排序,而不仅仅是按照第一次看到的顺序进行复制:

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

你得到的是
1,11,3
,因为没有
sort
-n
参数,你是按字母而不是数字排序的,
11
(即
1
)的第一个字符在
3
的第一个字符之前,我现在正在研究这部分。刚刚编辑,使用
-n
可以获得排序输出。否则11在3之前,因为它是按字母顺序排序的。在这两种情况下(文本有连字符和没有连字符),我都有一个错误消息:“awk:line 1:对数组a的非法引用”@blue_xylo奇怪。。。试一下
{a[$3]+}
例如在第一个块中。@fedorqui您的awk(第一个)解决方案是否进行排序?@Kent否。我没有您提到的GNU awk使用
asorti()
。我正在研究这部分。刚刚编辑,使用
-n
可以获得排序输出。否则11在3之前,因为它是按字母顺序排序的。在这两种情况下(文本有连字符和没有连字符),我都有一个错误消息:“awk:line 1:对数组a的非法引用”@blue_xylo奇怪。。。请尝试使用
{a[$3]+}
,例如在第一个块中。@fedorqui您的awk(第一个)解决方案是否进行排序?@Kent否。我没有您提到的GNU awk使用
asorti()
。您的第一个解决方案根本不起作用。第二个解决方案给出了带连字符文本的正确答案,并给出了不带连字符文本的第3列=,1,3,11是的,我在第一部分使用了错误的输入数据。但是,当我删除连字符时,我的解决方案仍然有效,您是如何删除它们的?嗯。。。有趣的是:当我尝试tr-d-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