Record_type(첫 번째 필드)을 기준으로 후행 쉼표를 제거해야 합니다. 입력 파일에는 50개의 구분 기호가 있으며 레코드 유형에 따라 구분 기호를 줄여야 합니다. 첫 번째 필드가 400이면 마지막 10개의 구분 기호가 제거되고, 300이면 5개의 구분 기호가 제거되고, 210이면 2개의 쉼표가 제거됩니다. 400, 300, 210의 패턴이 반복되며 순서는 동일하게 유지되어야 합니다.
예를 들어:
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,,,,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,,,
출력이 필요합니다.
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,
awk와 sed를 시도했지만 전체 파일이 잘립니다.
답변1
sed는 귀하의 요구 사항을 충족할 수 있습니다. 그러면 원하는 문자열 시작과 일치한 다음 끝에서 원하는 수의 쉼표가 제거됩니다.
sed -e '/^400/ s/,\{10\}$//' -e '/^300/ s/,\{5\}$//' -e '/^210/ s/,\{2\}$//'
답변2
AWK 방법. trunk
인덱스 0부터 인덱스 길이(n자)까지 하위 문자열의 전체 줄을 인쇄하는 함수를 정의합니다 . 남은 것은 간단한 패턴 일치와 trunk
함수 호출, 적절한 수의 문자 제거뿐입니다.
라이너로서:
$ awk -F ',' 'function trunk(n){print substr($0,0,length($0)-n)}; $1==400{trunk(10)};$1==300{trunk(5)};$1==210{trunk(2)} ' input.txt
스크립트에서 보면 다음과 같습니다.
#!/usr/bin/awk -f
BEGIN { FS="," };
function trunk(n){
print substr($0,0,length($0)-n)
};
$1==400{ trunk(10)};
$1==300{trunk(5)};
$1==210{trunk(2)};
작동 중입니다.
$ ./trunk_lines.awk input.txt
400,"100.00",,,,"31",,,,"510","410","0102","023",,,,,,,,,,,,,,,,,,,,
300,"110","1",,"2016-04-15",,,"52706","TESTFR1","100.00","1.00",,,"N",,,,
210,"6876262",,"23 Rue du Roule",,,"PARIS","DF","75001","FR",,,,,,,,,,,,,,,,
답변3
후행 필드가 비어 있는 경우(또는 해당 필드도 제거하려는 경우)
awk -F, -vOFS=, '$1=="400"{NF-=10} $1=="300"{NF-=5} $1=="210"{NF-=2} 1' file
또는 똑똑해지고 싶다면(그것은 좋은 것일 수도 있고 나쁜 것일 수도 있습니다)
awk -F, -vOFS=, 'BEGIN{x[400]=10;x[300]=5;x[210]=2} {NF-=x[$1]} 1' file