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
여기에서 캐스트가 Bool
is 인 경우 마지막 두 문이 실행됩니다 True
. $i.Bool
is 인 경우 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