我有一个像这样的文件(user.csv)
ip,hostname,user,group,encryption,aduser,adattr
Run Code Online (Sandbox Code Playgroud)
想按用户打印所有列排序,
我试过awk -F ":" '{print|"$3 sort -n"}' user.csv,它不起作用.
jay*_*ngh 146
怎么样sort.
sort -t, -nk3 user.csv
Run Code Online (Sandbox Code Playgroud)
哪里
-t,- 将分隔符定义为,.
-n - 给你数字排序.自您在尝试中添加它以来添加.如果您的用户字段仅为文本,那么您不需要它.
-k3 - 定义字段(键).user是第三个字段.
dag*_*elf 17
鉴于最初的问题是关于如何使用awk,前 7 个答案中的每一个都使用sort替代,并且这是 Google 上的热门搜索,以下是如何使用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,-,-,-
Run Code Online (Sandbox Code Playgroud)
和sort.awk:
#!/usr/bin/env -S awk -f
#
# original source:
# /sf/answers/4603821841/
#
# Usage:
# awk -f sort.awk [-F<field separator>] [-v h=HAS_HEADER] [-v f=COLUMN_TO_SORT_BY] INPUT_FILE
# Examples:
# awk -f sort.awk -F, -v h=1 -v f=1 input.csv > output.csv
# cat input.txt | awk -f sort.awk | tee -a output.txt
# for each line
{
if (h && NR == 0) {
print $0
} else {
a[NR-h]=$0 ""
s[NR-h]=$f ""
}
}
END {
isort(s, a, NR-h);
for (i = 1; i <= NR-h; 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
}
}
Run Code Online (Sandbox Code Playgroud)
要使用它:
请参阅脚本中的标题。
小智 13
假设用户ID不包含任何空格,请使用sed删除重复的用户ID.
awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
Run Code Online (Sandbox Code Playgroud)小智 8
你可以选择一个分隔符,在这种情况下我选择了一个冒号并打印了第一列,按字母顺序排序:
awk -F\: '{print $1|"sort -u"}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)
awk -F, '{ print $3, $0 }' user.csv | sort -nk2
Run Code Online (Sandbox Code Playgroud)
对于逆序
awk -F, '{ print $3, $0 }' user.csv | sort -nrk2
Run Code Online (Sandbox Code Playgroud)
试试这个 -
awk '{print $0|"sort -t',' -nk3 "}' user.csv
Run Code Online (Sandbox Code Playgroud)
要么
sort -t',' -nk3 user.csv
Run Code Online (Sandbox Code Playgroud)