2017-11-27 19 views
1

awkスクリプトから2つのデータをフォーマットしようとしています。ここに私の生データの一部ですawkを使用してファイルをフォーマットする

Mike:James:314849866:[email protected]:5059358554:NM:8830:Johnson:Rd:Albuquerque:87122 

このように合計9行あります。私は電話番号、(505)935から8554のような5行目をフォーマットしたい

cat rawadd | awk -F: ' NR == 1,NR == 9 {print $1 " " $2 ", " $3 "\n" $7 " " $8 " " $9 "\n" $10 ", " $6 " " $11 "\n" $4 "\n" $5 

:私はこのコードを使用してこのようにし

Mike James, 314849866 
8830 Johnson Rd 
Albuquerque, NM 87122 
[email protected] 
5059358554 

それをフォーマットしました。そこで私は新しい変数$ telを作成し、それをrawaddファイルから抽出した$ 5変数に置き換えました。

tel=`"(${5:0:3}) ${5:3:3}-${5:6:4}"` 


cat rawadd | awk -F: ' NR == 1,NR == 9 {print $1 " " $2 ", " $3 "\n" $7 " " $8 " " $9 "\n" $10 ", " $6 " " $11 "\n" $4 "\n" $tel "\n"}'; 

しかし、私の出力は、それだけで、実際のライン入力を出力5行目では、この

Mike James, 314849866 
8830 Johnson Rd 
Albuquerque, NM 87122 
[email protected] 
Mike:James:314849866:[email protected]:5059358554:NM:8830:Johnson:Rd:Albuquerque:87122 

のように出てくる、とされていません。ここで

は、新しいコードは次のようになりますフォーマットされた電話番号。私はフォーマットをawkコマンドに直接追加することを望んでいましたが、方法を理解することはできません。私はまた、最初の行のId番号を314-84-9866に書式化したいと思います。どんな助けも素晴らしいだろう。

はここ

+0

あなたの '$ tel'変数は' awk'には表示されません。一重引用符内にあります。bash変数は代用されません。コード化された方法がawkでうまくいかないように見えていました。その代わりに、 ''(substr($ 5,1,3) ")" .. etc'を 'awk'スクリプトで使用する必要があります。 – karakfa

+0

Google UUOCで、 'cat rawadd'がどのような値を追加しているのかを考えてみましょう。 –

答えて

1
@karakfas answerと非常に似て

が、任意のawkに動作しますが、私はより良いあなたの本当の出力フィールドを表し考えるOFSの選択を使用して、あなただけのオリジナルのスクリプトのように最初の9本の入力ライン、処理します:

$ cat tst.awk 
BEGIN { FS=":"; OFS=", " } 
{ 
    print $1 " " $2, substr($3,1,3) "-" substr($3,4,2) "-" substr($3,6) 
    print $7 " " $8 " " $9 
    print $10, $6 " " $11 
    print $4 
    print "(" substr($5,1,3) ")" substr($5,4,3) "-" substr($5,7) 
} 
NR==9 { exit } 

$ awk -f tst.awk file 
Mike James, 314-84-9866 
8830 Johnson Rd 
Albuquerque, NM 87122 
[email protected] 
(505)935-8554 

あなたtel変数で持った最初の問題は、あなたが書いたときにということである。

tel=7 
awk '{print $tel}' 

あなたは実際に2つの全く異なる変数、0で作成されたtelという名前のシェル変数を持っていますシェルスクリプト内のと、telという名前のawk変数もawkスクリプト内でprint $telによって作成され、同じ名前のシェル変数とは完全に無関係です。

2番目の問題は、awk変数の内容にアクセスするには変数名だけを使用することです。これはCと同じように、シェルの場合のように$の前には付けません。

awk変数telは設定されていないので、値0またはnullが得られます(すべてのawk変数は数値文字列型です - Google)ので、$telを使用すると、あなたの内容が入力行全体(レ​​コード)の$0と同じ場合と同じです。

これらのすべてが一緒になって、入力行が出力に再現されていたのです。あなたがやろうとして何をすべきか

構文は次のようになります。

-v tel="$tel"telという名前のシェル変数の内容を telという名前のawkの変数を初期化している

。より明確に:

shelltel=7 
awk -v awktel="$shelltel" '{print awktel}' 

それは、awkがシェルされていないことを理解することが非常に重要です - それはそれ自身のスコープと構文がはるかにCに似たシェルに比べて、言語とは完全に独立したツールです。

+1

エド、ありがとう、私はこのルートを行く! – Ububtunoob

0

gawkと一つの解決策、

awk -F: '{ 
      print $1, $2 ",", gensub(/(...)(..)(....)/,"\\1-\\2-\\3",1,$3); 
      print $7, $8, $9; 
      print $10 ",", $6, $11; 
      print $4 
      print gensub(/(...)(...)(....)/,"(\\1)\\2-\\3",1,$5) 
     }' file 

Mike James, 314-84-9866 
8830 Johnson Rd 
Albuquerque, NM 87122 
[email protected] 
(505)935-8554 

あなたNR==1 ...は私にどんな意味がありませんでした与えるでいただきありがとうございます。たぶん何らかの理由がありますが、説明する必要があります。

+0

NR == 1、NR == 9はファイルの1〜9行目を読み込み、選択したものに基づいてフォーマットしています。電話番号とIDをフォーマットした部分を除いて、すべて正常に動作します。私が持っているコマンドを試してみたいのですが、awkコマンドに新しい変数を追加することはできないので、結局あなたのメソッドを利用する必要があるかもしれません。私のコメントがあなたには意味をなさない限り。ありがとうございます – Ububtunoob

+0

@エドモートンモートン、私の拳のコマンドを見れば、ちょうど "$ 5"を表示して電話番号を表示します。できるだけ効率的にコードを実行することを望んでいたので、変数 "$ tel"で電話番号を再フォーマットして、awkコマンドに挿入することができるようにしたいと考えていました。私はこれが最善の方法ではないことを認識しています。 Karakfaは私の目的のためにawkを最も効率的に使用しているようです。 – Ububtunoob

関連する問題