如何使用第3列的awk排序

use*_*340 79 awk

我有一个像这样的文件(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是第三个字段.

  • @Matthew`sort -t',' - k3,3n -k6,6n`会更好.`-k3`将使用第3列和其余部分. (3认同)
  • 如何使用第2列?例如,我想先按第6列排序,然后按第3列排序. (2认同)
  • 如果 CSV 中存在包含逗号的带引号的字符串,则此操作将不起作用(除非您要排序的列早于包含逗号的列)。您可能必须先使用 awk 进行传递(使用 FPAT="[^,]*|\"[^\"]*\"" 和 OFS="|" 或其他可以与排序一起使用的分隔符) (2认同)
  • @user2452340 你可以这样做:`sort -t, -nk3 filename.csv | sort -t, -nk6` - 首先它将按第 3 列排序,然后按第 6 列排序,因此第 6 列始终正确排序,对于第 6 列相同的任何行,这些行将按第 3 列排序。 (2认同)

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)

要使用它:
请参阅脚本中的标题。

  • 感谢您实际回答用户的问题... (3认同)

小智 13

  1. 使用awk将用户ID放在前面.
  2. 分类
  3. 假设用户ID不包含任何空格,请使用sed删除重复的用户ID.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    
    Run Code Online (Sandbox Code Playgroud)

  • `sort` 已经知道如何按特定列进行排序,但是这种技术 - 称为 [Schwartzian 变换](https://en.wikipedia.org/wiki/Schwartzian_transform) - 当您想要排序的字段时非常有用sort on 并不是一个定义明确的列。 (2认同)

小智 8

你可以选择一个分隔符,在这种情况下我选择了一个冒号并打印了第一列,按字母顺序排序:

awk -F\: '{print $1|"sort -u"}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)


vsi*_*ngh 7

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)


VIP*_*MAR 5

试试这个 -

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)