我有一个像这样的文件(user.csv)
ip,hostname,user,group,encryption,aduser,adattr
想要按用户打印所有列排序,
我试过awk -F ":" '{print|"$3 sort -n"}' user.csv
了,它不起作用。
我有一个像这样的文件(user.csv)
ip,hostname,user,group,encryption,aduser,adattr
想要按用户打印所有列排序,
我试过awk -F ":" '{print|"$3 sort -n"}' user.csv
了,它不起作用。
怎么样sort
。
sort -t, -nk3 user.csv
在哪里
-t,
- 将您的分隔符定义为,
.
-n
- 给你数字排序。添加,因为您在尝试中添加了它。如果您的用户字段仅为文本,那么您不需要它。
-k3
- 定义字段(键)。用户是第三个字段。
假设用户 ID 不包含任何空格,请使用 sed 删除重复的用户 ID。
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
您可以选择一个分隔符,在这种情况下,我选择了一个冒号并打印了第一列,按字母顺序排序:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
awk -F, '{ print $3, $0 }' user.csv | sort -nk2
和相反的顺序
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
尝试这个 -
awk '{print $0|"sort -t',' -nk3 "}' user.csv
或者
sort -t',' -nk3 user.csv
看到最初的问题是关于如何使用awk
的,前 7 个答案中的每一个都使用sort
,而且这是谷歌上的热门话题,这里是如何使用awk
.
带有标题的示例 net.csv 文件:
ip,hostname,user,group,encryption,aduser,adattr
192.168.0.1,gw,router,router,-,-,-
192.168.0.2,server,admin,admin,-,-,-
192.168.0.3,ws-03,user,user,-,-,-
192.168.0.4,ws-04,user,user,-,-,-
和 sort.awk:
#!/usr/bin/awk -f
# usage: ./sort.awk -v f=FIELD FILE
BEGIN {
FS=","
}
# each line
{
a[NR]=$0 ""
s[NR]=$f ""
}
END {
isort(s,a,NR);
for(i=1; i<=NR; i++) print a[i]
}
#insertion sort of A[1..n]
function isort(S, A, n, i, j) {
for( i=2; i<=n; i++) {
hs = S[j=i]
ha = A[j=i]
while (S[j-1] > hs) {
j--;
S[j+1] = S[j]
A[j+1] = A[j]
}
S[j] = hs
A[j] = ha
}
}
要使用它:
awk sort.awk f=3 < net.csv # OR
chmod +x sort.awk
./sort.awk f=3 net.csv
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
这应该工作
为了从排序中排除第一行(标题),我将它分成两个缓冲区。
df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
使用GNU awk
:
awk -F ',' '{ a[$3]=$0 } END{ PROCINFO["sorted_in"]="@ind_str_asc"; for(i in a) print a[i] }' file
有关更多排序算法,请参阅8.1.6 使用带有 gawk 的预定义数组扫描顺序。