如何格式化Linux中uniq -c命令输出的数据?
问题与解决方法
问题背景
现有temp_data.txt文件内容:
"John","001-01-0001","engineering" "Smith","192-11-0292","human resources" "Brian","192-11-0292","operations" "Lucius","992-11-0292","human resources" "Smith","192-11-0292","human resources"
执行sort temp_data.txt | uniq -c > temp_data_count.txt后,得到的temp_data_count.txt内容为:
1 "John","001-01-0001","engineering" 2 "Smith","192-11-0292","human resources" 1 "Brian","192-11-0292","operations" 1 "Lucius","992-11-0292","human resources"
需要将其转换为计数加引号并前置的格式:
"1","John","001-01-0001","engineering" "2","Smith","192-11-0292","human resources" "1","Brian","192-11-0292","operations" "1","Lucius","992-11-0292","human resources"
此前尝试awk '{print "\x22" $2 "\x22",$1}'出现数据截断,原因是awk默认以空格为字段分隔符,"human resources"中的空格会把该行拆分为多个字段,导致输出内容不完整。
正确解决方法
方法1:处理已有temp_data_count.txt文件
使用awk修改字段分隔符,并清除计数中的空格:
awk -F'"' '{gsub(/ /,"",$1); print "\""$1"\","$2","$3","$4}' temp_data_count.txt
-F'"'把双引号设为字段分隔符,确保含空格的字段不会被拆分;gsub(/ /,"",$1)清除计数字段中的多余空格;- 最后拼接成目标格式输出。
方法2:另一种字段处理思路
提取计数后,拼接剩余内容:
awk '{count=$1; $1=""; gsub(/^ /,"",$0); print "\""count"\","$0}' temp_data_count.txt
- 先把第一个字段(计数)存入变量
count; - 清空
$1后,用gsub(/^ /,"",$0)去掉行首的空格; - 把带引号的计数和处理后的行内容拼接输出。
方法3:一步完成去重计数与格式转换
无需生成中间文件temp_data_count.txt,直接用awk完成统计和格式输出:
sort temp_data.txt | awk '{count[$0]++} END{for (line in count) print "\""count[line]"\","line}'
sort先对原文件内容排序;- awk用数组
count统计每行出现的次数; - 最后遍历数组,输出带引号的计数和对应行内容。
内容的提问来源于stack exchange,提问作者Adi Sharma
相关产品推荐
相关产品推荐

