줄의 특정 부분에서 공백을 쉼표로 바꿉니다.

줄의 특정 부분에서 공백을 쉼표로 바꿉니다.

다음은 데이터베이스 쿼리의 출력입니다.

    1 KALI,REGISTERED
    2 KALI,PROCESSING
    3 KALI,RECEIVED
    1 KALI,SUBMITTED
    7 KALI,SUCCEEDED
    4 WEKA,PROCESSING

출력은 매번 변경되며 행 수는 쿼리가 마지막으로 실행되었을 때와 다를 수 있지만 형식은 항상 다음과 같습니다 number space word,word. 다음과 같이 보이도록 해야 합니다 number,word,word. 쿼리 자체로 이 문제를 처리하려고 했지만 데이터베이스가 이를 지원하지 않아서 Linux를 사용하여 처리하기로 결정했습니다. 이 명령을 사용하여 공백을 쉼표로 바꿉니다. sed -e 's/\s\+/,/g' command.output.다음과 같은 출력이 표시됩니다.

,1,KALI,REGISTERED,
,2,KALI,PROCESSING,
,3,KALI,RECEIVED,
,1,KALI,SUBMITTED,
,7,KALI,SUCCEEDED,
,4,WEKA,PROCESSING,  

하지만 나는 배열에 저장할 수 있도록 다음과 같은 것을 기대하고 있습니다.

1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING  

더 많은 명령을 시도했지만 아무 것도 작동하지 않았습니다. 이 출력을 어떻게 얻을 수 있습니까?

답변1

이상적으로는 필요한 형식으로 데이터를 출력하도록 데이터베이스 쿼리를 변경해야 합니다.

$ awk -v OFS=',' '{ $1 = $1; print }' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

awk이는 공백이나 탭으로 구분된 데이터를 쉼표로 구분된 데이터로 다시 포맷하는 데 사용됩니다 . OFS출력 필드 구분 기호를 쉼표로 설정한 다음 각 입력 레코드의 필드 값을 수정하면 레코드 awk가 새 출력 구분 기호로 다시 생성됩니다. 인쇄하면 원하는 결과가 나옵니다.

awk기본적으로 각 줄을 읽을 때 각 줄의 선행 또는 후행 공백도 무시됩니다.

다음을 사용하여 이 작업을 수행하려면 sed먼저 초기 공백을 모두 제거한 다음 남은 첫 번째 공백을 쉼표로 변경합니다.

$ sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]/,/' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING

이 패턴은 공백이나 탭과 일치합니다( Perl 정규 표현식과 [[:blank:]]마찬가지로 ). \s나는 습관적으로 그것을 사용하지만 실제로 탭을 다루지 않는 한 (질문에서 명확하지 않음) 단일 리터럴 공백을 사용하고 싶을 것입니다. sed동일한 매개변수에 두 표현식을 모두 작성할 수도 있습니다 .

sed 's/^ *//; s/ /,/' file

관련 정보