如何使用awk按第3列排序
我有一个这样的文件(user.csv)如何使用awk按第3列排序,awk,Awk,我有一个这样的文件(user.csv) ip,hostname,user,group,encryption,aduser,adattr 要按用户打印所有列排序 我尝试了awk-F:“{print |“$3 sort-n”}”user.csv,它不起作用。只排序如何 sort -t, -nk3 user.csv 在哪里 -t,-将分隔符定义为, -n-为您提供数字排序。添加,因为您已将其添加到 尝试。如果用户字段是纯文本,则不需要它 -k3-定义字段(键)。用户是第三个字段 使用awk将用
ip,hostname,user,group,encryption,aduser,adattr
要按用户打印所有列排序
我尝试了
awk-F:“{print |“$3 sort-n”}”user.csv
,它不起作用。只排序如何
sort -t, -nk3 user.csv
在哪里
-t,
-将分隔符定义为,
-n
-为您提供数字排序。添加,因为您已将其添加到
尝试。如果用户字段是纯文本,则不需要它
-k3
-定义字段(键)。用户是第三个字段
使用awk将用户ID放在前面
分类
假设用户ID不包含任何空格,则使用sed删除重复的用户ID
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
和相反的顺序
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
您可以选择一个分隔符,在本例中,我选择了一个冒号并打印了第1列,按字母顺序排序:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
试试这个-
awk '{print $0|"sort -t',' -nk3 "}' user.csv
或
为了从排序中排除第一行(标题),我将其拆分为两个缓冲区
df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
鉴于最初的问题是关于如何使用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
}
}
#/usr/bin/awk-f
#用法:./sort.awk-v f=字段文件
开始{
FS=“,”
}
#每行
{
a[NR]=$0“
s[NR]=$f“
}
结束{
isort(s,a,NR);
对于(i=1;isort-t,-k3 file
如何使用排序2列?例如,我希望先按第6列排序,然后再按第3列排序。如果CSV中有带引号的字符串包含逗号,则此操作无效(除非您要排序的列早于包含逗号的列)。您可能必须首先通过awk(使用FPAT=“[^,]*\\”[^\“]*\”和OFS=“|”或其他可用于排序的分隔符)@user2452340您可以这样做:sort-t,-nk3 filename.csv | sort-t,-nk6
-首先它将按第3列排序,然后按第6列排序,这样第6列就一直正确排序,对于第6列相同的任何行,它们将按第3列排序。@Matthewsort-t','-k3,3n-k6,6n
会更好。-k3
将使用第3列和该行的其余部分。我只需要-t,将我的2列文件除以逗号,谢谢JayPalt。这非常有用,特别是当您需要解析或合并列以添加排序字段,然后只保留原始行时。我使用awk/split解析/合并日期和时间字段以进行排序,然后删除。sort
已经知道如何按特定列进行排序,但是当您要排序的字段不是一个定义良好的列时,这种技术(称为)非常有用。
to排序是否使用内置的toawk
?如果不是,你知道为什么-V
-版本排序在这里不起作用吗?另外,如果我选择不使用-t
选项,似乎要选择第三列,我确实需要使用-k4
-odd!
awk -F "," '{print $0}' user.csv | sort -nk3 -t ','
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,-,-,-
#!/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