2013-10-04 3 views
3

AWK를 사용하여 데이터베이스에서 열을 제거한 후 긴 SQL 스크립트를 수정하려고합니다.AWK 필드 분리 자 소실

내가 노력하고 선은 수정 :

INSERT INTO `table` (`one`, `two`, `three`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'); 

내 AWK 스크립트 : 나는 실행

BEGIN { 
    FS="," 
} 
/`table`/ { $3=$8=""; print } 

:

awk -f script.awk in.sql > out.sql 

이 내가 그것을 원하는가 거의 다 무엇 do, 필드 구분 기호 (쉼표)를 모두 제거하는 것만 제외하면 다음과 같습니다.

INSERT INTO `table` (`one` `two` `four` `five` `six`) VALUES ('alpha' 'bravo' 'delta' 'echo' 'foxtrot'); 

이중 쉼표 만 있으면 gsub 또는 다른 것을 사용하여 하나의 쉼표로 바꾸어야합니다.

쉼표는 어떻게됩니까?

답변

1

입력 구문을 더 잘 보존하기 위해 출력 필드 구분 기호 OFS을 쉼표로 설정할 수 있습니다.

1

필드에 값을 할당하면 awk는 출력 필드 구분 기호 OFS를 사용하여 입력 레코드를 재구성합니다. 필드에 값을 할당하는 대신 전체 기록에 작동 된 RE를 사용하지 마십시오

  1. 설정 FS=OFS="," 대신 FS="," 너무 레코드가 쉼표를 사용하여 다시 작성됩니다, 또는
  2. : 당신은이 선택 사항이 있습니다.

    $ awk '{print gensub(/(([^,]+,){2})[^,]+,(([^,]+,){4})[^,]+,/,"\\1\\3","")}' file 
    INSERT INTO `table` (`one`, `two`, `four`, `five`, `six`) VALUES ('alpha', 'bravo', 'delta', 'echo', 'foxtrot'); 
    
    :

당신은 이미 당신이 여기에 gensub()에 대한 GNU AWK를 사용하여 "2"를 수행하는 방법, 빈 필드를 제거 두 번 OFSs을 제거해야 할 것 "1"을 할 것을하는 방법을 알고

개별 필드를 사용하지 않으므로 FS 또는 OFS를 지정할 필요가 없으며 레코드가 다시 컴파일되지 않으므로 오류 일 수있는 빈 필드를 제거 할 필요가 없습니다 -prone

원하는 경우 sed를 사용하여 동일한 작업을 수행 할 수 있습니다.