|
다음 과 같이 두 가지 유형의 필드 구분 기호가 있는 레코드(행)가 있는 파일이 있습니다 !
.
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 ''
.
또한 여기에 있는 다양한 필드 구분 기호는 편리하며 거의 모든 인접한 필드를 병합하도록 조정할 수 있습니다.