約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
改行文字を表します(すべてのsed
sに対して機能しない可能性があります)。
(*)バラより私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?さまざまな正規表現タイプの違いを学びます。また、多くのsed
オンラインチュートリアルがあります。 1つまたは2つを見つけて、少なくともコマンドに慣れるようにしてくださいs///
。
答え4
GNU awkを使う:
awk -v RS=' usec[,\n] ?' '{print (NR%2?"delayMicroseconds":"pulseIR")"("$0")"}' file
これは文字列をusec
レコード区切り文字として使用します。これにより、各数字を別のレコードとしてキャプチャできるため、print
コマンドは必要な数字を持つ2つの文字列を交互に表示します。