是否使用awk,sort或类似的方法来排序或反转多列CSV表的单个列,同时按照它们的相同顺序保留其余列?
例如,我有:
6, 45, 9
5, 47, 6
4, 46, 7
3, 48, 4
2, 10, 5
1, 11, 1
并希望:
1, 45, 9
2, 47, 6
3, 46, 7
4, 48, 4
5, 10, 5
6, 11, 1
因此,只对第一列进行排序,其余列为先前的顺序。
答案 0 :(得分:2)
这可能对您有用:
paste -d, <(cut -d, -f1 file | sort) <(cut -d, -f2- file)
答案 1 :(得分:1)
awk one-liner
awk -F, '{c[NR]=$1;l[NR]=$2", "$3}END{for(i=1;i<=NR;i++) print c[NR-i+1]", "l[i]}' file
测试
kent$ echo "6, 45, 9
5, 47, 6
4, 46, 7
3, 48, 4
2, 10, 5
1, 11, 1"|awk -F, '{c[NR]=$1;l[NR]=$2", "$3}END{for(i=1;i<=NR;i++) print c[NR-i+1]", "l[i]}'
1, 45, 9
2, 47, 6
3, 46, 7
4, 48, 4
5, 10, 5
6, 11, 1
答案 2 :(得分:0)
如果你GNU awk
这里有一个班轮:
$ gawk '{s[NR]=$1;c[NR]=$2 $3}END{for(i=0;++i<=asort(s);)print s[i] c[i]}' file
1,45,9
2,47,6
3,46,7
4,48,4
5,10,5
6,11,1
如果没有,这是一个实现简单冒泡排序的awk
脚本:
{ # read col1 in sort array, read others in col array
sort[NR] = $1
cols[NR] = $2 $3
}
END { # sort it with bubble sort
do {
haschanged = 0
for(i=1; i < NR; i++) {
if ( sort[i] > sort[i+1] ) {
t = sort[i]
sort[i] = sort[i+1]
sort[i+1] = t
haschanged = 1
}
}
} while ( haschanged == 1 )
# print it
for(i=1; i <= NR; i++) {
print sort[i] cols[i]
}
}
将其保存到文件sort.awk
并执行awk -f sort.awk file
:
$ awk -f sort.awk file
1,45,9
2,47,6
3,46,7
4,48,4
5,10,5
6,11,1