csv 파일의 여러 행을 1개 행으로 요약하는 방법은 무엇입니까? SQL에서 쿼리를 실행해 보았지만 작동하지만 Linux에서 동일한 효과를 얻는 방법을 잘 모르겠습니다.
내 현재 파일은 다음과 같습니다.
swainb02,Ben Swain,1015
swainb02,Ben Swain,1016
swainb02,Ben Swain,1018
swainb02,Ben Swain,1020
shaiks21,Sarah Shaikh,0073
shaiks21,Sarah Shaikh,0080
shaiks21,Sarah Shaikh,0082
여러 사용자가 여러 지역 코드에 액세스할 수 있습니다. 내가 찾고 있는 것은 가독성을 높이기 위한 더 간단한 버전의 파일입니다.
원하는 출력:
swainb02,Ben Swain,1015,1016,1018,1020
shaiks21,Sarah Shaikh,0073,0080,0082
이 문제를 해결하는 방법을 아시나요? 감사해요
답변1
입력이 질문에 표시된 대로 키 값으로 그룹화되어 있다고 가정하고(입력을 먼저 정렬하지 않는 경우) 모든 Unix 시스템의 모든 쉘에서 awk를 사용하면 입력 파일의 크기에 관계없이 거의 문제가 없습니다. 메모리 사용:
$ cat tst.awk
BEGIN { FS=OFS="," }
{ curr = $1 OFS $2 }
curr != prev {
printf "%s%s", ors, curr
prev = curr
ors = ORS
}
{ printf "%s%s", OFS, $3 }
END { printf ors }
$ awk -f tst.awk file
swainb02,Ben Swain,1015,1016,1018,1020
shaiks21,Sarah Shaikh,0073,0080,0082
답변2
awk
결과에 대해 작은 스크립트를 실행하십시오.
awk -F, '
$1$2 != Last {printf DL "%s", $0
Last=$1$2
DL=ORS
next
}
{printf ",%s", $3
}
END {print ""
}
' file
swainb02,Ben Swain,1015,1016,1018,1020
shaiks21,Sarah Shaikh,0073,0080,0082
새로운 사용자의 데이터를 한 번 인쇄한 후 다음 사용자를 만날 때까지 지역 번호를 추가합니다.
답변3
입력이 쉼표, 개행 또는 따옴표가 포함되지 않은 간단한 CSV라고 가정하면 GNU를 사용하여 datamash
처음 두 개의 쉼표로 구분된 필드를 그룹화하고 세 번째 필드를 축소할 수 있습니다.
$ datamash -t, groupby 1,2 collapse 3 <file
swainb02,Ben Swain,1015,1016,1018,1020
shaiks21,Sarah Shaikh,0073,0080,0082
이는 데이터가 처음 두 필드에 정렬되어 있다고 가정합니다(또는 예제 데이터에 표시된 것처럼 함께 정렬된 레코드가 파일에서 서로 옆에 있다고 가정합니다). 그렇지 않은 경우 sort -t, -k 1,2
데이터가 먼저 전달되거나 datamash
해당 -s
(또는 --sort
) 옵션과 함께 사용됩니다.
범용 CSV 입력의 경우 Miller( )와 같은 CSV 인식 도구를 사용하십시오 mlr
. 다음은 위와 동일한 작업을 수행합니다.
$ mlr --csv -N nest --ivar comma -f 3 file
swainb02,Ben Swain,"1015,1016,1018,1020"
shaiks21,Sarah Shaikh,"0073,0080,0082"
CSV를 지원 하므로 mlr
조합의 세 번째 필드와 포함된 쉼표를 올바르게 인용합니다.
답변4
이 awk 버전은 줄 순서에 관계없이 작동합니다.
{
if ($1 "," $2 in a) {
a[$1 "," $2] = a[$1 "," $2] "," $3
} else {
a[$1 "," $2] = $3
}
}
END {
for (i in a) {
print i, a[i]
}
}
반면에 csvkit은 더 정확한 결과를 출력합니다.
csvsql -H -d ',' --query 'SELECT a,b, GROUP_CONCAT(c) as c FROM data GROUP BY a, b' data.txt
a,b,c
shaiks21,Sarah Shaikh,"73.0,80.0,82.0"
swainb02,Ben Swain,"1015.0,1016.0,1018.0,1020.0"
따옴표가 없으면 더 보기 좋지만 다른 예에서는 행당 필드 수가 달라질 수 있습니다. 추가 처리를 위해서는 정의된 세 번째 필드가 있는 출력이 매우 바람직합니다.