구분된 파일의 첫 번째 필드를 기준으로 각 줄의 후행 쉼표를 자릅니다.

구분된 파일의 첫 번째 필드를 기준으로 각 줄의 후행 쉼표를 자릅니다.

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

관련 정보