AWK: CSV에서 반복되는 헤더 줄을 어떻게 제거합니까?

AWK: CSV에서 반복되는 헤더 줄을 어떻게 제거합니까?

여러 CSV를 연결하여 생성된 CSV를 처리하면서 헤더 줄의 반복을 제거할 수 있는 가능성을 찾고 있습니다(연결된 각 CSV에 동일한 내용이 있음). 다음은 첫 번째 줄의 반복이 포함된 CSV입니다.

ID(Prot),   ID(lig),    ID(cluster),    dG(rescored),   dG(before), POP(before)
1000,   lig40,  1,  0.805136,   -5.5200,    79
1000,   lig868, 1,  0.933209,   -5.6100,    42
1000,   lig278, 1,  0.933689,   -5.7600,    40
1000,   lig619, 3,  0.946354,   -7.6100,    20
1000,   lig211, 1,  0.960048,   -5.2800,    39
1000,   lig40,  2,  0.971051,   -4.9900,    40
1000,   lig868, 3,  0.986384,   -5.5000,    29
1000,   lig12,  3,  0.988506,   -6.7100,    16
1000,   lig800, 16, 0.995574,   -4.5300,    40
1000,   lig800, 1,  0.999935,   -5.7900,    22
1000,   lig619, 1,  1.00876,    -7.9000,    3
1000,   lig619, 2,  1.02254,    -7.6400,    1
1000,   lig12,  1,  1.02723,    -6.8600,    5
1000,   lig12,  2,  1.03273,    -6.8100,    4
1000,   lig211, 2,  1.03722,    -5.2000,    19
1000,   lig211, 3,  1.03738,    -5.0400,    21
ID(Prot),   ID(lig),    ID(cluster),    dG(rescored),   dG(before), POP(before)
10V1,   lig40,  1,  0.513472,   -6.4600,    150
10V1,   lig211, 2,  0.695981,   -6.8200,    91
10V1,   lig278, 1,  0.764432,   -7.0900,    70
10V1,   lig868, 1,  0.787698,   -7.3100,    62
10V1,   lig211, 1,  0.83416,    -6.8800,    54
10V1,   lig868, 3,  0.888408,   -6.4700,    44
10V1,   lig278, 2,  0.915932,   -6.6600,    35
10V1,   lig12,  1,  0.922741,   -9.3600,    19
10V1,   lig12,  8,  0.934144,   -7.4600,    24
10V1,   lig40,  2,  0.949955,   -5.9000,    34
10V1,   lig800, 5,  0.964194,   -5.9200,    30
10V1,   lig868, 2,  0.966243,   -6.9100,    20
10V1,   lig12,  2,  0.972575,   -8.3000,    10
10V1,   lig619, 6,  0.979168,   -8.1600,    9
10V1,   lig619, 4,  0.986202,   -8.7800,    5
10V1,   lig800, 2,  0.989599,   -6.2400,    20
10V1,   lig619, 1,  0.989725,   -9.2900,    3
10V1,   lig12,  7,  0.991535,   -7.5800,    9
ID(Prot),   ID(lig),    ID(cluster),    dG(rescored),   dG(before), POP(before)
10V2,   lig40,  1,  0.525767,   -6.4600,    146
10V2,   lig211, 2,  0.744702,   -6.8200,    78
10V2,   lig278, 1,  0.749015,   -7.0900,    74
10V2,   lig868, 1,  0.772025,   -7.3100,    66
10V2,   lig211, 1,  0.799829,   -6.8700,    63
10V2,   lig12,  1,  0.899345,   -9.1600,    25
10V2,   lig12,  4,  0.899606,   -7.5500,    32
10V2,   lig868, 3,  0.903364,   -6.4800,    40
10V2,   lig278, 3,  0.913145,   -6.6300,    36
10V2,   lig800, 5,  0.94576,    -5.9100,    35

이 CSV를 사후 처리하려면 헤더 줄의 반복을 제거해야 합니다.

ID(Prot),   ID(lig),    ID(cluster),    dG(rescored),   dG(before), POP(before)

융합된 CSV의 시작 부분(첫 번째 줄!)에만 헤더를 유지합니다. 첫 번째 줄을 찾는 다음 awk one-liner를 사용하고 그 반복 항목을 제거하려고 했습니다.

 awk '{first=$1;gsub("ID(Prot)","");print first,$0}' mycsv.csv > csv_without_repeats.csv

그러나 헤더 라인을 인식하지 못했습니다. 이는 패턴이 올바르게 정의되지 않았음을 의미합니다.

반복을 필터링한 후 줄을 정렬하려면 다른 코드를 정렬하기 위해 추가로 파이프를 연결해야 한다고 가정하면 내 AWK 코드를 어떻게 수정할 수 있습니까?

awk '{first=$1;gsub(/ID(Prot)?(\([-azA-Z]+\))?/,"");print first,$0}' | LC_ALL=C sort -k4,4g input.csv > sorted_and_without_repeats.csv

답변1

다음은 첫 번째 줄이 아닌 이상 awk으로 시작하는 모든 줄을 건너뛰는 스크립트 입니다 .ID(Prot)

awk 'NR==1 || !/^ID\(Prot\)/' file > newFile

다음은 동일한 아이디어입니다 perl.

perl -ne 'print if $.==1 || !/^ID\(Prot\)/' file > newFile

또는 원본 파일을 그 자리에서 편집하려면 다음을 수행하세요.

perl -i -ne 'print if $.==1 || !/^ID\(Prot\)/' file 

답변2

POSIX 호환 sed( GNU sed및 에서 테스트됨 busybox sed):

sed '1!{/^ID/d;}' data

로 시작하는 경우 첫 번째 줄을 제외한 모든 줄을 삭제합니다 ID. 일부 구현에는 파일을 제자리에서 편집할 수 있는 옵션이 sed있습니다 .-i


awk:

awk 'NR == 1 {h=$0; print} $0 == h {next}1' data

첫 번째 줄에 있는 경우 헤더를 저장하고 인쇄합니다. 그런 다음 각 줄에 대해 이것이 헤더와 같으면 처리하고, 그렇지 않으면 인쇄합니다.


또는 다음과 같습니다 perl.

perl -lne '$h = $_ if $. == 1; print if($_ ne $h || $. == 1)' data

파일을 그 자리에서 편집 -i할 수 있는 옵션을 추가합니다 .perl

답변3

다음은 유틸리티를 사용하여 pbm을 처리하는 간단한 방법 중 하나입니다 awk. 그러나 헤더에 공백이 더 많거나 적더라도 출력에 포함된다는 점에 유의하세요.

awk '
  NR>1&&$0==hdr{next}
  NR==1{hdr=$0}1
' file

동일한 접근 방식이지만 스트림 편집기 유틸리티 sed에서:

sed -En '
  1h;1!G;/^(.*)\n\1$/!P
' file

답변4

$ awk 'NR==1{h=$0; print} $0!=h' file
ID(Prot),   ID(lig),    ID(cluster),    dG(rescored),   dG(before), POP(before)
1000,   lig40,  1,  0.805136,   -5.5200,    79
1000,   lig868, 1,  0.933209,   -5.6100,    42
1000,   lig278, 1,  0.933689,   -5.7600,    40
1000,   lig619, 3,  0.946354,   -7.6100,    20
1000,   lig211, 1,  0.960048,   -5.2800,    39
1000,   lig40,  2,  0.971051,   -4.9900,    40
1000,   lig868, 3,  0.986384,   -5.5000,    29
1000,   lig12,  3,  0.988506,   -6.7100,    16
1000,   lig800, 16, 0.995574,   -4.5300,    40
1000,   lig800, 1,  0.999935,   -5.7900,    22
1000,   lig619, 1,  1.00876,    -7.9000,    3
1000,   lig619, 2,  1.02254,    -7.6400,    1
1000,   lig12,  1,  1.02723,    -6.8600,    5
1000,   lig12,  2,  1.03273,    -6.8100,    4
1000,   lig211, 2,  1.03722,    -5.2000,    19
1000,   lig211, 3,  1.03738,    -5.0400,    21
10V1,   lig40,  1,  0.513472,   -6.4600,    150
10V1,   lig211, 2,  0.695981,   -6.8200,    91
10V1,   lig278, 1,  0.764432,   -7.0900,    70
10V1,   lig868, 1,  0.787698,   -7.3100,    62
10V1,   lig211, 1,  0.83416,    -6.8800,    54
10V1,   lig868, 3,  0.888408,   -6.4700,    44
10V1,   lig278, 2,  0.915932,   -6.6600,    35
10V1,   lig12,  1,  0.922741,   -9.3600,    19
10V1,   lig12,  8,  0.934144,   -7.4600,    24
10V1,   lig40,  2,  0.949955,   -5.9000,    34
10V1,   lig800, 5,  0.964194,   -5.9200,    30
10V1,   lig868, 2,  0.966243,   -6.9100,    20
10V1,   lig12,  2,  0.972575,   -8.3000,    10
10V1,   lig619, 6,  0.979168,   -8.1600,    9
10V1,   lig619, 4,  0.986202,   -8.7800,    5
10V1,   lig800, 2,  0.989599,   -6.2400,    20
10V1,   lig619, 1,  0.989725,   -9.2900,    3
10V1,   lig12,  7,  0.991535,   -7.5800,    9
10V2,   lig40,  1,  0.525767,   -6.4600,    146
10V2,   lig211, 2,  0.744702,   -6.8200,    78
10V2,   lig278, 1,  0.749015,   -7.0900,    74
10V2,   lig868, 1,  0.772025,   -7.3100,    66
10V2,   lig211, 1,  0.799829,   -6.8700,    63
10V2,   lig12,  1,  0.899345,   -9.1600,    25
10V2,   lig12,  4,  0.899606,   -7.5500,    32
10V2,   lig868, 3,  0.903364,   -6.4800,    40
10V2,   lig278, 3,  0.913145,   -6.6300,    36
10V2,   lig800, 5,  0.94576,    -5.9100,    35

관련 정보