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函数)
- 按数字升序排序
- 单行输出
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