我有一个管道分隔的文本文件,如下所示
user |amount|dept|flag
AAAAAAAAA|100.00|SALES|OK
BBBBBBBBB|250.00|ACCOUNT|OK
CCCCCCCCC|200.00|MARKETING|OK
DDDDDDDDD|175.00|ADMIN|OK
AAAAAAAAA|150.00|SALES|OK
BBBBBBBBB|200.00|ACCOUNT|OK
我想根据第一列排列序列号。作为
user |amount|repeatation|dept|flag
AAAAAAAAA|100.00|1 |SALES|OK
AAAAAAAAA|100.00|2 |SALES|OK
BBBBBBBBB|250.00|1 |ACCOUNT|OK
BBBBBBBBB|250.00|2 |ACCOUNT|OK
CCCCCCCCC|200.00|1 |MARKETING|OK
DDDDDDDDD|175.00|1 |ADMIN|OK
我已经为许多文件创建了序列号,这些文件会自动递增++sl
,但对这个一无所知。
答案1
尝试
awk -F\| '{$3 = NR==1?"repetation":++T[$1] FS $3; }1' OFS=\| file
user |amount|repetation|flag
AAAAAAAAA|100.00|1|SALES|OK
BBBBBBBBB|250.00|1|ACCOUNT|OK
CCCCCCCCC|200.00|1|MARKETING|OK
DDDDDDDDD|175.00|1|ADMIN|OK
AAAAAAAAA|150.00|2|SALES|OK
BBBBBBBBB|200.00|2|ACCOUNT|OK
它使用“条件运算符”将“重复”添加到标头(NR==1)或第三个字段前面的实际计数器。格式化和/或排序留给读者作为练习。
答案2
$ awk '
BEGIN{FS=OFS="|"} {$2=sprintf("%s|%-10s", $2, (NR>1 ? ++rep[$1] : "repetition")); print (NR>1), $0}
' file | sort -t'|' -k1,1n -k2,2 -k4,4n | cut -d'|' -f2-
user |amount|repetition|dept|flag
AAAAAAAAA|100.00|1 |SALES|OK
AAAAAAAAA|150.00|2 |SALES|OK
BBBBBBBBB|250.00|1 |ACCOUNT|OK
BBBBBBBBB|200.00|2 |ACCOUNT|OK
CCCCCCCCC|200.00|1 |MARKETING|OK
DDDDDDDDD|175.00|1 |ADMIN|OK
上面使用了对线条类型进行分类的常见习惯用法,以便您可以先按类别对它们进行排序,然后再按每个类别中的值对它们进行排序。在本例中,我曾经NR>1
将标题行分类为类型0
,并将所有其他行分类为类型1
(此方法最常见的应用),因此对第一个字段输出进行排序将首先打印标题行。最后cut
只是再次删除该分类。
答案3
排序 -k1 yourfile.txt |awk -F"|" '开始 { slno=0 } { 用户=$1; { if (用户!=x) slno=1; { printf("|%9s|%10.2f|%3s|%10s|%3s|\n",$1,$2,slno,$3,$4); slno++; x=用户; } } }'