세 개의 필드를 하나의 파일로 병합하는 AWK 하나의 라이너

세 개의 필드를 하나의 파일로 병합하는 AWK 하나의 라이너

|다음 과 같이 두 가지 유형의 필드 구분 기호가 있는 레코드(행)가 있는 파일이 있습니다 !.

Name|Age|Physics|Chemistry|Maths|English|Batch!Year!AdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS!2021!1001!A!75
Student2|72|63|60|50|75|EWS!2021!1002!A!85
Student3|72|63|60|50|75|EWS!2021!1002!A!85

아래에 제공된 Batch, Year및 필드를 병합하는 방법은 무엇입니까 AdmisnNo?

간결함을 위해 유용한 필드의 작은 하위 집합을 표시하지만 실제 파일에는 관련 필드가 많이 있습니다. 2~3개의 마커를 제거하려는 !필드 는 마지막 필드가 아니며 전체 49개 필드 중 임의의 필드(6 또는 7개)일 수 있습니다.

Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
    Student1|81|65|70|80|88|EWS20211001!A!75
    Student2|72|63|60|50|75|EWS20211002!A!85
    Student3|72|63|60|50|75|EWS20211002!A!85

간청 awk하지만 합리적인 표준 주문은 환영합니다.

답변1

$ awk -F '|' 'BEGIN { OFS = FS } { sub("!", "", $NF); sub("!", "", $NF) }; 1' file
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

이는 입력한 마지막 구분 필드에서 처음 두 문자를 제거하는 데 사용됩니다 awk.!|

NF코드에서 임의의 숫자 대체를 사용하면 awk마지막 필드를 제외한 다른 필드에 영향을 미칠 수 있습니다.


마지막 필드에만 !문자가 포함되어 있다고 가정하면 다음을 사용하십시오 sed.

$ sed -e 's/!//' -e 's///' file
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

!이렇게 하면 각 행의 첫 번째 항목이 제거됩니다. 그런 다음 !두 번째를 삭제하는 동안 정확히 동일한 교체를 두 번째로 수행합니다 .


!각 행을 반전시키고 세 번째 행을 연속으로 두 번 삭제한 다음 결과 행을 다시 반전시킵니다. 이렇게 하면 다른 |구분 필드에도 !문자가 포함될 수 있습니다.

$ rev file | sed -e 's/!//3' -e 's///3' | rev
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

답변2

$ cat in | while read -r line ; do line="${line/\!/}" ; echo "${line/\!/}"; done
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

답변3

네 번째 인수로 GNU awk를 사용하십시오 split().

$ awk '{n=split($0,f,/[|!]/,s); s[7]=s[8]=""; for (i=1;i<=n;i++) printf "%s%s", f[i], s[i]; print ""}' file
Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

답변4

이 작업은 sed필드를 분할하지 않고 7번째 필드를 다음 필드와 병합하는 데 적합합니다.

sed -E 's/|\|!//7' file

다시 실행하면 7번째 항목(원래 8번째 항목)이 다음 항목과 병합됩니다. 완전히:

sed -Ee 's/|\|!//7' -Ee 's/|\|!//7' file

또는 더 짧습니다(Philippos가 제안함). 첫 번째 대체가 이루어지면 두 번째 대체가 발생하기 때문입니다.

sed -E 's/\||!//7;s///7' file

-E이식성(즉, 확장 정규식)을 위해 사용되기도 합니다 .

산출:

Name|Age|Physics|Chemistry|Maths|English|BatchYearAdmisnNo!Grade!Score
Student1|81|65|70|80|88|EWS20211001!A!75
Student2|72|63|60|50|75|EWS20211002!A!85
Student3|72|63|60|50|75|EWS20211002!A!85

참고로 첫 번째 대체 이후 8번째 필드가 7번째 필드가 되었기 때문에 7다시 사용합니다. 그것은 마치 sed '' file | sed ''.

또한 여기에 있는 다양한 필드 구분 기호는 편리하며 거의 모든 인접한 필드를 병합하도록 조정할 수 있습니다.

관련 정보