텍스트 파일 형식을 지정하는 SED 명령

텍스트 파일 형식을 지정하는 SED 명령

아래에 언급된 조건으로 입력 파일을 수정하려면 SED 명령을 생성해야 합니다.

아래와 같은 입력 파일이 있습니다.

항목 목록

Rad# ; ID_KEY ; UNIT_ID
1  ; 30000000004 ; 8417920 
2  ; 30000000004 ; 8170811 
10  ; 30000000004 ; 1581292
1001  ; 3000000000 ; 8285052

이 파일로 수행해야 할 작업은 다음과 같습니다.

  1. 첫 번째 줄을 완전히 제거하십시오.
  2. 두 번째와 세 번째 숫자 집합만 쉼표로 구분하여 유지하세요.
  3. ,DATABASE각 줄 끝에 문자열을 추가합니다.

출력은 아래와 같아야 합니다.

항목 목록

30000000004,8417920,DATABASE
30000000004,8170811,DATABASE

답변1

질문의 출력이 원하는 출력이라고 가정하면 이를 시도해 볼 수 있습니다.

awk -F';'  'BEGIN{OFS=",";} NR>1{gsub(/ /,""); print $2,$3,"DATABASES"}' filename | sed -e :a -e '$!N;s/\n/,/;ta' 

어쩌면 그게 유일한 방법일지도 모릅니다 awk. sed줄을 같은 줄에 두려면 해당 섹션을 삭제하세요.

SE는 교육적인 목적을 갖고 있는 것 같으므로 위 명령에서 각 플래그의 역할을 설명하겠습니다.

-F';';# 다음으로 사용 --field-separator
BEGIN {OFS=",";}# 이것은 후속 명령 이전에 실행되는 특수 모드이며 해당 출력은 프로그램의 나머지 부분에 영향을 받지 않습니다. 그럼 우리는ORS

ORS# 출력에는 쉼표가 포함되어야 하므로 쉼표를 값으로 ,정의합니다 . Output Record Separator기본값 ORS은 개행입니다."\n"

NR>1# 여기서는 첫 번째 레코드를 건너뛴다고 말합니다. NR총 입력 레코드 수를 저장하는 데 사용되는 특수 예약 변수이기도 합니다.

gsub()#은 일부 매개변수를 허용하는 함수입니다. 예 $2를 들어 필드가 지정되지 않은 경우 $3then gsub()함수는 전체 레코드를 사용합니다.$0

마지막으로 지정된 필드가 인쇄되어 줄 끝에 print $2,$3,"DATABASE"추가됩니다 .DATABASE

print $2,$3# 여기서는 쉼표를 사용하여 필드를 구분합니다. 기본 FS (Field separator)구분 기호는 단일 공백입니다 ' '.

이 간략한 설명으로 몇 가지 사항이 명확해졌기를 바랍니다.

답변2

나는 당신이 (질문의 첫 번째 버전에서와 같이 모두 한 줄에 함께 실행되는 대신) 헤더 뒤의 각 입력 줄을 출력 줄로 변환하기를 원한다고 가정합니다.  sed작업에 매우 좋은 도구로 사용할 수 있습니다.

sed -e 1d -e "s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/"파일 이름

어디

  • 1d첫 번째 행을 삭제한다는 의미이며,
  •                 s/.* ; \(.*\) ; \(.*[^ ]\) */\1,\2,DATABASE/
    즉, 첫 번째 줄 이후의 각 줄을 분리한 다음 제외되는 해당 부분의 후행 공백으로 바꿉니다.
                    something1 ; something2 ; something3

                    something2,something3,DATABASE
    .*[^ ]something3

답변3

의견에서와 같이 awk 솔루션은 다음과 같습니다.

awk '{ FS=";"; OFS=","; gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); gsub(/^[ \t]+/, "", $3); gsub(/[ \t]+$/, "", $3); } NR > 1 { print $2, $3, "DATABASE" }' file

답변4

나는 이것을 할 수 있습니다 :

cut -d' ' -f3,5 <infile | 
sed -n 'y/ /,/;1!s/$/,DATABASE/p'

...저는 이것이 아마도 이 문제에 대한 가장 효율적인 해결책이라고 생각하기 때문입니다.

관련 정보