나는 이것을 여러 번 시도했지만 분명히 뭔가 빠졌고 도움이 필요합니다.
수천 개의 정보 행이 포함된 큰 테이블이 있고 이를 3, 4, 6열을 기준으로 정렬하려고 합니다. 이 열을 기준으로 행을 정렬했으며 이제 다음을 수행하려고 합니다.
열 3 = 이전 행, 열 3 && 열 4 < 이전 행, 열 5 && 열 6 = 이전 행, 열 6은 해당 행을 인쇄하지만 일치하는 행 번호가 처음 발생하면 시작을 수정합니다. 줄이지만 현재 줄 번호의 시작 부분을 수정합니다.
오류로 가득 찬 나의 잘못된 접근 방식은 다음과 같습니다.
awk -F, 'BEGIN { OFS = FS } {if ($4<prev5 && $3==prev3 && $6==prev6) print Marker,$0;else Marker=NR print NR,$0; prev5=$5; prev3=$3; prev6=$6}'
입력 예(보기 쉽게 쉼표로 구분):
a,b,2,15,50,ABBA
a,a,2,26,55,ABBA
b,a,2,80,99,ABA
c,a,3,20,40,CAN
a,b,3,51,300.CAN
a,a,4,1000,2000,ART
d,c,4,1700,2050,ART
b,a,4,1800,2051,ART
출력 예:
1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,4,1000,2000,ART
6,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART
주어진 기준에 따라 행을 그룹화하여 그룹 식별자가 행 번호 방법을 사용할 필요가 없도록 하고 싶습니다. 이를 수행하는 더 좋은 방법이 있다면 제안하겠습니다.
나는 항상 내가 알고 있는 기본 코드를 개선하고 싶어하기 때문에 누군가가 이 문제를 도와줄 수 있기를 바랍니다. 가능하다면 설명을 제공해 주시고 내 실수로부터 배우고 싶습니다!
답변1
코드를 여러 줄에 걸쳐 펼치면 코드를 더 읽기 쉽게 만들 수 있습니다.
awk -F, '
BEGIN { OFS = FS }
# Each line
{
if($3 == prev[3] && $4 < prev[5] && $6 == prev[6])
{
# Capture and use record number of last match
if(!nrMatched) { nrMatched = NR-1 }
print nrMatched, $0
}
else
{
# No match, reset matched flag and just copy record through
nrMatched = 0
print NR, $0
}
# Save fields from this line for next comparison
split($0, prev)
}
' datafile
산출
1,a,b,2,15,50,ABBA
1,a,a,2,26,55,ABBA
3,b,a,2,80,99,ABA
4,c,a,3,20,40,CAN
5,a,b,3,51,300.CAN
6,a,a,4,1000,2000,ART
6,d,c,4,1700,2050,ART
6,b,a,4,1800,2051,ART