ファイルの最初の 3 行に異なる変数をプレフィックスとして追加するにはどうすればよいですか?

ファイルの最初の 3 行に異なる変数をプレフィックスとして追加するにはどうすればよいですか?

そこで、メールで送られてきたログ (Windows 内) を調べて、モデルのシリアル番号を特定する行を探す必要があります。これを行う簡単な方法は、.msg を変換してファイルを読み取れるようにする見苦しいバッチ スクリプトを作成することだと考えました。例:

cat "*Pre*.msg" | strings2 > agrep.txt
cat agrep.txt | grep "D24" > a21s.txt
cat a21s.txt | cut -d" " -f7 > Air21Serials.txt

3 つの一意の数字が残るので、スペースまたは : を区切り文字として、行 1 に ALPHA、行 2 に BETA、行 3 に GAMMA を追加するにはどうすればよいですか?


アップデート:ファイルa21s.txt

0 1 BXP_0 AIR21B4AB2P KRC118046/1 R3B D240090254 20140416 
0 1 BXP_1 AIR21B4AB2P KRC118046/1 R3B D240088108 20140414 
0 1 BXP_2 AIR21B4AB2P KRC118046/1 R3B D240090208 20140414 

答え1

あなたが探しているものを実行する方法はたくさんありますが、いくつか例を挙げます。

awk カスタマイズされたソリューション

あなたの例に合わせた 1 つの解決策は、awk3 つの変数を使用して渡すことです。4 行ある場合は 4 つの変数を渡す必要があるなど、これは一般的ではありません...

このコマンドには、列の番号 ( 、...最後の列) awkを通じて列を管理する簡単な方法があります。$1$2$NF

  • ここでは読みやすくするために、古い中間ファイルを使用しますa21s.txt

    awk -v s1="ALPHA" -v s2="BETA" -v s3="GAMMA" '
      NR==1 {print s1,$7} ;  
      NR==2 {print s2,$7} ;  
      NR==3 {print s3,$7} ; '   a21s.txt
    
    • 最初の行では、awkオプションを使用して 3 つの変数を渡します-v
    • 次の行では、内部変数NRは行番号をカウントします。変数を印刷するにはs1最初の行がある場合のみ、s22番目も同様です。
    • 最後の行では'ファイル名を指定できるので、catプロセスを呼び出してパイプする必要がありませんawk
    • 変数 (ALPHA、BETA...) が何らかのメカニズム (例: "Serial01、Serial02") を使用して生成可能な場合は、行番号と外部変数のコントロールの代わりにそれを配置できます。
  • 実用的な注意:*nixでは命令列|中間ファイルを作成する必要なく、1 つの出力を次の出力にパイプします ( )。
    したがって、例では直接使用できます。

    cat "*Pre*.msg" | strings2 | grep "D24" | cut -d" " -f7 > Air21Serials.txt
    

    cutこの場合、の代わりにawk、 コマンド を使用できますcat "*Pre*.msg" | strings2 | grep "D24" | awk '...' > final_file.txt

より一般的な解決策: paste+awk

a21s.txtファイルと、b.txt同じ行数でプレフィックスを付ける文字列(それぞれ 1 語)を含む別のファイル( )があるとします(次の例を参照)。

ALPHA
BETA
GAMMA

単に

paste b.txt a21.txt | awk '{print $1,$8}' >  Air21Serials.txt

貼り付けの前に別の列を追加したため、シリアルの列が 8 番目になっていることに注意してください。


注記

Linux自体に問い合わせて、さらに詳しい情報を入手してくださいman awkman paste :-)

答え2

エコーアルファ>agrep.txt ; cat ".msg" | 文字列2>>agrep.txt

それは正確なラインではないかもしれません...コンセプトは、あなたが初めファイルに「Alpha」という単語を入れたいのですが、> 記号を使用してファイルを作成し、>> を使用してファイルに追加します。「改行」がなければ、そこに ALPHA という単語を入れてから、最初のメッセージを追加する必要があります。

コードを正確に動作させるには、少し試してみる必要があるかもしれません。

編集: 検索すると、そしてプリントechoはOSによって異なる可能性があるため、echoよりも優れたオプションです。

例: cat ("ALPHA: ") > agrep.txt ; cat ".msg" | 文字列2>>agrep.txt

そして、「ワンライナー」コマンドを実行するには、最初のパイプは ; または && であるべきでした。

; 中間のコマンドは常に次のコマンドを実行します && コマンド間は、前のコマンドが成功した場合にのみ次のコマンドを実行し、|| (二重パイプ) は前のコマンドが失敗した場合にのみ次のコマンドを実行します

答え3

入力がどのようなものかよくわからないstrings2ので、これが期待通りに動作するかどうか100%確信できません。しかし、少なくとも正しい方向を指し示すことになるかもしれません。stdincatからの入力を受け入れることができます。したがって、次のようにすることもできます。

echo ALPHA: | cat - "*Pre*.msg" | strings2 > agrep.txt
echo BETA: | cat - agrep.txt | grep "D24" > a21s.txt
echo GAMMA: | cat - a21s.txt | cut -d" " -f7 > Air21Serials.txt

関連情報