다음은 데이터베이스 쿼리의 출력입니다.
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