用于按 getent passwd 中用户名的字母顺序对列表进行排序的 AWK 脚本
AWK script to sort the list in alphabetical order of usernames in getent passwd
我是 awk 的新手,我正在尝试按字母顺序对第五组包含“Zack e”的用户名进行排序。我在我的终端输入 getent passwd
,它们是:
zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
这个方法我也试过
for i in `sed -e 's/.* \(\d\)*//' passwd.in | sort`; do grep $i passwd.in; done > file_sort.txt
但它所做的只是对第一组而不是所需的组进行排序。我如何将我的方法与 awk 脚本结合起来我所知道的在 awk 中要做的是 BEGIN {FS = ":"} == 1000{print }
有什么办法,我可以重新排列令牌以便排序可以工作,然后将它们放回原位?
为什么 'awk' 'sort' 可以优雅地完成这项工作?
sort -t : -k5 myFile.txt
或者反过来
sort -r -t : -k5 myFile.txt
使用 GNU awk 和 for
scanning order 在 </code> 对每条记录唯一时在输出中排序:</p>
<pre><code>$ awk -F: '{a[]=[=10=]}END{PROCINFO["sorted_in"]="@ind_str_asc";for(i in a)print a[i]}' file
输出:
bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
解释:
$ awk -F: '{ # set field delimiter
a[]=[=12=] # hash records, use as key
}
END {
PROCINFO["sorted_in"]="@ind_str_asc" # set the for traverse order
for(i in a) # use it
print a[i] # output
}' file
由于散列键是 </code>,因此它需要是唯一的以避免冲突。如果它们不是唯一的,我想在这种情况下,记录是唯一的,你可以:</p>
<pre><code>$ awk -F: '{
a[[=13=]]= # changed
}
END {
PROCINFO["sorted_in"]="@val_str_asc" # changed
for(i in a)
print i # changed
}' file
当然还有函数 asort
和 asorti
对数组进行排序,如上面的示例在输出时排序。例如,我们希望 $5 不是唯一的:
$ awk -F: '{
a[[=14=]]= # record is unique, is not expected to be
}
END {
n=asorti(a,b,"@val_str_asc") # asorti to preserve [=14=] in b but order from a[] value
for(i=1;i<=n;i++) # sorted to b, index rewritten from 1..n
print i, b[i]
}' file
现在输出:
1 bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
2 armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
3 hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
4 zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
我是 awk 的新手,我正在尝试按字母顺序对第五组包含“Zack e”的用户名进行排序。我在我的终端输入 getent passwd
,它们是:
zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
这个方法我也试过
for i in `sed -e 's/.* \(\d\)*//' passwd.in | sort`; do grep $i passwd.in; done > file_sort.txt
但它所做的只是对第一组而不是所需的组进行排序。我如何将我的方法与 awk 脚本结合起来我所知道的在 awk 中要做的是 BEGIN {FS = ":"} == 1000{print }
有什么办法,我可以重新排列令牌以便排序可以工作,然后将它们放回原位?
为什么 'awk' 'sort' 可以优雅地完成这项工作?
sort -t : -k5 myFile.txt
或者反过来
sort -r -t : -k5 myFile.txt
使用 GNU awk 和 for
scanning order 在 </code> 对每条记录唯一时在输出中排序:</p>
<pre><code>$ awk -F: '{a[]=[=10=]}END{PROCINFO["sorted_in"]="@ind_str_asc";for(i in a)print a[i]}' file
输出:
bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false
解释:
$ awk -F: '{ # set field delimiter
a[]=[=12=] # hash records, use as key
}
END {
PROCINFO["sorted_in"]="@ind_str_asc" # set the for traverse order
for(i in a) # use it
print a[i] # output
}' file
由于散列键是 </code>,因此它需要是唯一的以避免冲突。如果它们不是唯一的,我想在这种情况下,记录是唯一的,你可以:</p>
<pre><code>$ awk -F: '{
a[[=13=]]= # changed
}
END {
PROCINFO["sorted_in"]="@val_str_asc" # changed
for(i in a)
print i # changed
}' file
当然还有函数 asort
和 asorti
对数组进行排序,如上面的示例在输出时排序。例如,我们希望 $5 不是唯一的:
$ awk -F: '{
a[[=14=]]= # record is unique, is not expected to be
}
END {
n=asorti(a,b,"@val_str_asc") # asorti to preserve [=14=] in b but order from a[] value
for(i=1;i<=n;i++) # sorted to b, index rewritten from 1..n
print i, b[i]
}' file
现在输出:
1 bruh:x:1542:1546:Burh RG:/home/banner:/bin/bash
2 armvad:x:3:3:Ezikon Armvad:/dev:/usr/sbin/nologin
3 hp:x:118:7:HPLIP system user:/var/run/hplip:/bin/false
4 zack:x:115:120:Zack E:/home/zack:/var/run/bin/bash/false