Linux에서 문자열을 가져온 후 특정 출력

Linux에서 문자열을 가져온 후 특정 출력
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service

Linux에서 이 출력을 필터링하고 결과를 얻어야 합니다.

first_service,second_service

답변1

GNU 사용sed

$ sed -Ez 's/[^0-9]*[^[:alpha:]]*([^ ]*) ([^\n]*)\n?/\1_\2,/g;s/,$/\n/' input_file
first_service,second_service

답변2

사용행복하다(이전 Perl_6)

~$ raku -e 'my $i=0; my @a; for lines() {  \
            $i=1 and next if /^ \s+ SERVICE_NAME /;  \
            if ($i.Bool) { @a.push: .words.skip.join("_") } else {next};};  \
            .put for @a.join(",");'  file

또는

~$ raku -e 'my @a; for lines() {  \
            @a.push( $_.words.skip.join: "_" ) if /^ \s+ SERVICE_NAME / ^fff * }; \
            .put for @a.join(",");'  file

입력 예:

Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service

예제 출력:

first_service,second_service

Raku는 Perl 계열의 프로그래밍 언어입니다. 이 프로젝트는 Larry Wall과 동료들에 의해 2000년에 시작되었습니다. 2015년 12월에 처음 출판되었습니다. Perl6 언어 이름이 변경됨행복하다2019.

위의 첫 번째 대답: 코드는 스칼라 $i와 배열을 선언합니다 @a. 을 사용하여 입력을 얻습니다 lines(). 블록 내에서 {...}센티넬 라인을 검색하세요. ^ \s+ SERVICE_NAME발견되면 $i설정되고 1코드는 해당 next줄에서 계속됩니다.

$i여기에서 캐스트가 Boolis 인 경우 마지막 두 문이 실행됩니다 True. $i.Boolis 인 경우 True블록 {...}이 입력됩니다. 행이 공백으로 분할되고 .words첫 번째 단어(예: 숫자)가 skip추가되고 나머지에는 join밑줄이 그어집니다. 마지막으로 쉼표로 put끝나는 줄이 나옵니다 .join

위의 두 번째 답변: 코드는 Raku의 sed유사한 "트리거" 연산자 fff와 그 변형을 사용합니다. ^fff센티넬 라인이 발견된 후 라인을 캡처하기 위해 코드의 변형이 열립니다 SERVICE_NAME. 이는 *대상 파일 끝까지의 모든 행이 push배열에 추가됨을 의미합니다. 텍스트 처리 및 out 에 대한 위의 설명을 참조하세요 put.

https://docs.raku.org/언어/operators#infix_^fff
https://raku.org

답변3

이 솔루션에는 분명히 개선의 여지가 있습니다. 내가 일을 더 잘했다면 sed이 일이 한 번의 통화로 압축될 수 있을 것 같습니다 sed. 숫자 문자열로 시작하지 않는 패턴 공간을 제거하는 grep방법을 안다면 이 문제를 제거할 수도 있습니다. sed더 좋을 수도 있습니다 awk.

grep -E '^[0-9]+' input_file |
    sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
    sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'

$ cat << EOF > input_file
Controller loading lists...
-------------------------------------------------
command: select SERVICE_NAME from <table_name>
-------------------------------------------------
        SERVICE_NAME
1       first service
2       second service
39      third of four
427     fourth and final service
EOF
$ grep -E '^[0-9]+' input_file |
    sed -E -e 's/^[0-9]+ +//' -e 's/ /_/g' |
    sed -e ':a' -e 'N;$!ba' -e 's/\n/,/g'
first_service,second_service,third_of_four,fourth_and_final_service

관련 정보