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ファミリーのプログラミング言語です。このプロジェクトは、ラリー・ウォールと同僚によって2000年に始まりました。 2015年12月に初めて公開されました。 Perl6言語名が変更されました幸せ2019.

上記の最初の答え:コードはスカラー$iと配列を宣言します@a。を使って入力を取得しますlines()。ブロック内で{...}センチネルラインを検索してください。^ \s+ SERVICE_NAME見つかった場合は$i設定され、1コードはそのnext行に続きます。

$iここでキャストがBoolisの場合、最後の2つのステートメントが実行されますTrue$i.Boolisの場合、Trueブロック{...}が入力されます。行が空白に分割され、.words最初の単語(数字など)がskip追加され、残りにjoin下線が付けられます。最後に、カンマで終わる行putが出てきます。join

上記の2番目の答え:コードはRakuのsed同様の「トリガー」演算子fffとそのバリアントを使用します。^fffセンチネルラインが見つかった後、ラインをキャプチャするためにコードのバリエーションが開きますSERVICE_NAME。これは*、ターゲットファイルの最後までのすべての行が配列pushに追加されることを意味します。テキスト処理とアウトの上記の説明を参照してください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

関連情報