タグ付けされた質問 「awk」

パターン指向のスキャンおよび処理言語。

2
「e」なしで科学フォーマットを操作する
科学表記法で数値を含むファイルを操作しようとしていますが、e記号はありません。つまり、1.2e+3と書かれてい1.2+3ます。 私がやって考える最も簡単な方法は、awk交換した+とe+使用して、gsub機能を新しいファイルで私の計算を行います。マイナスの場合も同様です。したがって、次のコマンドを使用して簡単な修正を行うことができます awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in すべての列で同じことを行います。 ただし、ファイルには負の値も含まれているため、少し複雑になります。サンプルファイルは次のとおりです。 1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6 2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4 3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6 4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6 6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5 7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5 9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5 9.248130+1 5.000000-1 3.069610-3 …

1
文字列で配列要素を参照し、awkで配列を初期化する
#!/usr/bin/env bash awk ' BEGIN { arr[A]=1; arr[B]=1; arr[C]=1; arr[E]=1; arr[J]=8; arr[Q]=10; print arr[J] }' 上記のコマンドは、の最新の設定値を出力します。arr['subscript']この場合10は、arr[Q]直前の値であり、の値ではprintありません。8arr[J] また、上記のスクリプトのように、一度に1行ずつarr['A'], arr['B'], arr['C'] and arr['E']同じ値を持つ値に値を割り当てたくはありません1。代わりに、パラメータの1つとして添え字の配列を渡し、他のパラメータとして共通の値を渡します。それらに値を割り当てるロジック。
8 awk  array 

3
sedを使用してテキストファイルの一部とそれに続く行を削除する
次のようにファイルを編集する必要があります。 auto wlx00 allow-hotplug wlx00 iface wlx000 inet dhcp iface wlx000 inet6 auto post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2 auto wlx000 目標は、「iface ... inet6」で始まる行を削除し、スペースで始まる次の数行を削除することです(1つも複数でもかまいません)。 iface wlx000 inet6 auto post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2 残りはそのままにして、次の結果を出します。 auto wlx00 allow-hotplug wlx00 iface wlx000 inet dhcp auto wlx000 私は次のようにしてsedを使って試しました: sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile しかし、それは適切な場所から始まり、最後まで消去するすべてを削除します。選択したifaceテキストの後に、スペースで始まる行を削除したいだけです。

4
スペースで区切るが、バックスラッシュスペースは無視する
5678 [] testing,\ group [] [testing [] ip\ 5.6.7.8 [] launch-wizard-1 0.0.0.0/0 456dlkjfa [] 1.2.3.4 [] test 1.2.3.4/32 4.3.2.0/23 4.3.2.0/23 default 4.3.2.0/23 4.3.2.0/23 launch-wizard-2 0.0.0.0/0 launch-wizard-3 0.0.0.0/0 2.3.4.5/32 [] 上記の最初の列を取得したいのですが、問題は、\ (バックスラッシュスペース)を列の一部として扱う必要があるためawk '{print $1}'です。 5678 testing,\ group [testing ip\ 5.6.7.8 launch-wizard-1 456dlkjfa 1.2.3.4 test default launch-wizard-2 launch-wizard-3 2.3.4.5/32

2
共通のヘッダーを使用して2つのファイルの行をマージするにはどうすればよいですか?
ヘッダーとして存在する共通データに基づいて2つのファイルをマージしたい。 以下はその例です ファイル1 >Feature scaffold1 1 100 g 101 200 g 201 300 g >Feature scaffold2 1 100 g 01 500 g >Feature scaffold3 10 500 g >Feature scaffold4 10 300 g ファイル2 >Feature scaffold1 500 500 r 900 1000 r >Feature scaffold2 200 300 r >Feature scaffold3 100 200 …

4
bashで配列値をシフトする方法
例として6つのマウントポイントフォルダーを構築する /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg だから私たちは配列を使ってこの簡単なbashスクリプトを書きました folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 今、私たちはせずに、コードを変更したいカウンタとしましょう= $カウンタ=カウンタ+ 1 次の配列値を取得するために各ループを配列にシフトすることは可能ですか? のようなものとして ${folderArray[++]}

2
sedまたはawkを使用して、いくつかの文字を除くすべての行の.txtファイルに文字列を追加する方法
次の名前のテキストファイルがありますxid.txt。 xid: SC48028 id: artf398444 xid: indv1000 id: indv24519 xid: SC32173 id: artf398402 xid: SC21033 id: artf398372 xid: 1001 id: tracker4868 xid: wiki1000 id: wiki10709 xid: proj1234 id: proj12556 「SC48028」、「SC32173」などの前に「PT_」という文字列を追加する必要があります。文字列「SC ...」は、「AC ...」または「DL ..」の任意の組み合わせで開始できます。 必要な出力: xid: PT_SC48028 id: artf398444 xid: indv1000 id: indv24519 xid: PT_SC32173 id: artf398402 xid: PT_SC21033 id: artf398372 …

2
オプションの関数引数を検出(スカラー)
次のスクリプトについて考えてみましょう。 function alfa(bravo, charlie) { if (charlie) return "charlie good" else { return "charlie bad" } } BEGIN { print alfa(1, 1) print alfa(1, 0) print alfa(1, "") print alfa(1) } 結果: charlie good charlie bad charlie bad charlie bad Awkには、引数が提供されていないことを通知する方法がありますか?


6
1つの列のすべての値を1に置き換えます
12行3列のテキストファイルが複数あります。 例: 2 6 0.74 42 6 0.58 80 6 0 112 6 0.24 132 6 1 216 6 0.7 342 6 0 390 6 0.21 432 6 0.56 466 6 0.75 524 6 0.6 646 6 0.9 すべての行で3番目の列のすべての値を1に設定したいと思います。 出力は次のようになります。 2 6 1 42 6 1 80 6 1 112 …

3
数値を含む3つ以上のファイルを並べて比較
行ごとに1つずつ、並べ替えられた一連の数値を含む3つのファイルがあります。 file1 1 2 3 file2 1 3 4 file3 1 5 これらの3つのファイルを次のように並べて「整列」したいと思います。 file1 file2 file3 1 1 1 2 3 3 4 5 私は試しましたsdiffが、2つのファイルでしか機能しません

1
awkスクリプトでCtrl-Cをトラップする
私は信じているCtrl- Cのbashスクリプトでトラップすることができます。そのイベントを処理するために、Awkスクリプト内にトラップすることもできますか? たとえば、処理を中止するが、静かに終了するのではなく、すでに処理された結果を出力する場合はどうでしょうか。

5
プログラムでawkフレーバーを検出する方法(gawkとnawkなど)
私は基本的にbashシェルスクリプトのコレクションであるコマンドラインアプリケーションを使用しています。アプリケーションは、BSD / OSXおよびLinuxで実行するように作成されました。スクリプトの1つはawkに依存しています。これには2つのawkコマンドが含まれています。1つはnawk(標準のBSD awk実装)用に記述され、もう1つはgawk(GNU awk実装)用に記述されています。 問題の2つのawkコマンドは、異なる環境との互換性がありません。特に、gawkで実行するとnawkコマンドが失敗します。スクリプトは、uname -sホスト環境を判別するためにカーネル名(つまり)をチェックし、適切なawkコマンドを実行します。ただし、GNUコアユーティリティがインストールされたMac OS Xで作業することを好むため、スクリプトは正しく実行されません。 このバグを修正する最善の方法を考える過程で、できれば比較的堅牢で移植性のある方法で、一般的なコマンドラインユーティリティの異なるフレーバーをプログラムで区別する方法を知っておくとよいと思いました。 nawkがバージョン情報を出力するための「-V」フラグを受け入れないことに気付いたので、次のようなものが機能するはずだと考えました。 awk -V &>/dev/null && echo gawk || echo nawk 別のバリエーションは次のとおりです。 awk -Wversion &>/dev/null && echo gawk || echo nawk これは私の2つのテスト環境(OS XとCentOS)で動作するようです。ここに私の質問があります: これは最善の方法ですか? これを拡張してawkの他のバリエーション(例:mawk、jawkなど)を処理する方法はありますか? awkの他のバージョンについても心配する価値がありますか? また、私はawkについてほとんど知らないことも述べておきます。


3
awkは終了しません
というファイルに次のコードがありますawktest1.awk。 #!/bin/awk -f BEGIN{print "start"} {print $2, "\t", $5} END{print "end"} employee.txt にemployee.txtは次のデータが含まれます。 100 Thomas Manager Sales $5,000 200 Jason Developer Technology $5,500 300 Sanjay Sysadmin Technology $7,000 400 Nisha Manager Marketing $9,500 500 Randy DBA Technology $6,000 次のようにawkコマンドを実行します。 awk -f awktest1.awk しかし、印刷startして終了するだけではありません。誰かが私がここで間違っていることを手伝ってくれる?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.