Awkと正規表現を使用した出力フォーマットの指定

Awkと正規表現を使用した出力フォーマットの指定

約300行の長さの約20ファイルが、次の形式のデータで埋められています。

62640 usec, 3500 usec
1640 usec, 480 usec
360 usec, 520 usec
1200 usec, 500 usec
340 usec, 520 usec

次の形式のArduinoコードに変換したいと思います。

delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);

このように、DelayMicroseconds()関数の数字は各行の最初の数字、pulseIR()関数の数字は各行の2番目の数字です。

どんなアイデアがありますか?私はこれがawkで可能でなければならないと思います。

答え1

ここでは正規表現は必要ありません。printfフィールドを文字列にフォーマットするだけです。

$ awk '{printf("delayMicroseconds(%d);\npulseIR(%d);\n", $1, $3)}' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);

答え2

次のことを試すことができます。

    #!/bin/bash
    cat file |sed '1d' | while IFS= read line; do

    n1=$(echo $line | awk '{print $1}')
    n2=$(echo $line | awk '{print $3}') 

    echo "
    delayMicroseconds($n1);
    pulseIR($n2);
    "
    done

delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);

perlまたは、次のことを試すこともできます。

perl -pe 's/(\d+)[\D]+(\d+)[\D]+/delayMicroseconds($1);\npulseIR($2);\n/' file
delayMicroseconds(62640);
pulseIR(3500);
delayMicroseconds(1640);
pulseIR(480);
delayMicroseconds(360);
pulseIR(520);
delayMicroseconds(1200);
pulseIR(500);
delayMicroseconds(340);
pulseIR(520);

答え3

GNU sedの使用:

$ sed -Ee 's/([0-9]+) usec, ([0-9]+) usec.*/delayMicroseconds(\1);\npulseIR(\2);/' < data 
delayMicroseconds(62640);
pulseIR(3500);
...

-E現在の行で検索および置換操作を実行する拡張正規表現(*)を使用するように指示します(各sed入力に指定された指示を繰り返します)。s/pattern/replacement/sed

パターンは、前の「原子」のすべての数字、すべての数を([0-9]+) usec, ([0-9]+) usec.*意味し、一致する項目を保存(「キャプチャ」)します。 so は任意の数値を表し、結果を保存します。文字はそのまま一致し、最後の文字は任意の数の任意の文字と一致し、行の終わりに可能なすべてのゴミを消費します。[0-9]+(...)([0-9]+).*

置換では、\1および\2はグループに含まれる項目で置き換えられます(...)(ただし角かっこ自体はリテラルです)、\n改行文字を表します(すべてのsedsに対して機能しない可能性があります)。


(*)バラより私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?さまざまな正規表現タイプの違いを学びます。また、多くのsedオンラインチュートリアルがあります。 1つまたは2つを見つけて、少なくともコマンドに慣れるようにしてくださいs///

答え4

GNU awkを使う:

awk -v RS=' usec[,\n] ?' '{print (NR%2?"delayMicroseconds":"pulseIR")"("$0")"}' file

これは文字列をusecレコード区切り文字として使用します。これにより、各数字を別のレコードとしてキャプチャできるため、printコマンドは必要な数字を持つ2つの文字列を交互に表示します。

関連情報