输入:
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
?
答案 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
答案 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
的第一个字符。