ホームページ >php教程 >PHP开发 >awk コマンドと例

awk コマンドと例

高洛峰
高洛峰オリジナル
2016-12-15 11:09:261898ブラウズ

AWK の概要
9.1 awk を呼び出す 3 つの方法
:
1. コマンドラインメソッド:
awk [-F filed-separator] 'commands' input-files
-F 区切り文字を指定します (デフォルトはスペースまたはタブ)
commands awkコマンド
input-files は、処理されるファイルです
2. すべての awk コマンドをファイルに挿入し、awk プログラムを実行可能にし、スクリプトの最初の行として awk コマンド インタープリターを使用して、それを呼び出すことができるようにします。スクリプト名を入力します
3 . すべての awk コマンドを 1 つのファイルに挿入し、次のように呼び出します:
awk -f awk-script-file input-files
-f 呼び出し元のスクリプト名を指定します
input-files 処理するファイル

9.2 コマンド内の awk スクリプト
awk が呼び出されるとき、awk スクリプトはさまざまな操作とモードで構成されます。
awk は、一度に 1 つのレコードまたは行を読み取り、指定された区切り文字を使用して指定されたフィールドを区切ります。新しい行が表示されると、awk コマンドはレコード全体が読み取られたことを認識し、次のレコードで読み取りコマンドを開始します。この読み取りプロセスは、ファイルの終わりまで、またはファイルが存在しなくなるまで継続されます。
9.2.1 パターンとアクション
awk ステートメントはパターンとアクションで構成されます。モード部分は、アクション ステートメントがいつトリガーされるか、およびトリガー条件を決定します。処理とは、データに対して実行される操作です。モード部分を省略した場合、アクションは常に実行されたままになります。
パターンには、2 つの特殊フィールド BEGIN と END を含む、任意の条件ステートメント、複合ステートメント、または正規表現を使用できます。 BEGIN ステートメントを使用して、カウントとプリントヘッドを設定します。 BEGIN ステートメントはテキスト参照アクションの前に使用され、その後、入力ファイルに基づいてテキスト参照アクションの実行が開始されます。 END ステートメントは、awk がテキストの参照アクションを完了した後に、テキストの総数と終了ステータス フラグを出力するために使用されます。パターンを指定しない場合、awk は常に一致します。
実際のアクションは中括弧 {} 内に指定されます。ほとんどのアクションは出力用ですが、if ステートメントやループ ステートメント、ループ終了構造など、より長いコードもいくつかあります。アクションが指定されていない場合、awk は参照したすべてのレコードを出力します。
9.2.2 ドメインとレコード
awk が実行されると、その参照ドメインは $1、$2...$n としてマークされます。この方法はドメイン識別と呼ばれます。複数のドメインを指定する必要がある場合は、カンマを使用して区切ります。たとえば、最初のドメインを $1、$3 と指定し、すべてのドメインを指定する場合は、$0 を使用します。
印刷操作を実行するには print コマンドを使用します。これは awk コマンドであり、{} で囲む必要があります。
1. ドメインを抽出します
例: 次の内容の Grade.txt ファイルがあります:
$ cat Grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 Green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brown-3 12 26 26
L.Tansley 05/99 4712 Brwon-2 12 30 28
このテキスト ファイルには、次のように区切られた 7 つのフィールドがあります。ドメイン区切り文字としてスペース
2. awk 出力を保存する
awk 出力結果を保存する 2 つの方法:
ファイルにリダイレクトする: (画面表示なし)
$ awk '{print $0}' Grade.txt >wow
パイプを使用して結果を tee に出力: (結果を画面に表示)
$ awk '{print $0}' Grade.txt|tee woww
3. 標準入力を使用します
いくつかのメソッド:
$ Belts.awk Grade.txt
$ Belts.awk < ; Grade.txt
4. すべてのレコードを印刷します
$ awk '{print $0}' Grade.txt
5. $1 と $4 のみを印刷します:
$ awk '{print $1,$4}' Grade.txt 6. カスタム形式の印刷
$1 と $4、名前とベルトの上にコメントを追加できます:
$ awk 'BEGIN {print "NamettBeltn------ ---- --"} {print $1"t"$4}' Grade.txt
最後に終了コメントを追加します:
$ awk 'BEGIN {print "NamettBeltn------------- --- ---------"} {print $1"t"$4} END {print "------------------------ -nEnd of report"}' Grade.txt
7. awk エラー メッセージ プロンプト
awk エラーが発生した場合は、次のように検索できます。
• awk コマンド全体が一重引用符で囲まれていることを確認してください
• コマンド内のすべての引用符が表示されていることを確認してくださいペアで指定します
• アクション ステートメントは必ず中括弧 {} で囲み、条件ステートメントは中括弧 () で囲んでください
• 中括弧 {} を使用するのを忘れている可能性があります
8. awk キーボード入力
入力ファイルが指定されていない場合、awk はキーボードから入力を取得します。終了したら入力終了を押します
9.2.3 メタ文字
^ ( ) * + ?
ここで、+ と ? は awk にのみ適用され、grep や sed には適用されません:
+ 1 つ以上の前の単一文字と一致します
? 0 または 1 つの前の単一文字と一致します
例:
/XY+Z/ Xyz と一致します, xyyyyz
/xy? Z/matching xyz, xz
9.2.4 条件演算子
& lt; より小さい
== 等しい
=茶帯の生徒のすべての状況 ($4 がブラウンと一致する行を出力します)
$ awk '{if ($4~/Brown/) print $0}' Grade.txt
または
$ awk '$0 ~ /Brown/' Grade。 txt
2. 完全一致
条件と完全に一致するには == を使用し、条件を二重引用符で囲みます
例:
$ awk '{if ($3 == "48") print $0}' Grade.txt
3. match
使用 !~正規表現の不一致フィールドに従います
例:
茶帯ではないすべての生徒をクエリします ($4 が Brown と一致しない行を出力します)
$ awk '{if ($4!~/Brown/) print $0}' Grade.txt
または
$ awk '$0 !~ /Brown/' Grade.txt
4. 比較
いくつかの比較記号の使用方法は同じなので、例を挙げてみましょう:
$ awk '{ if ($6 < $7) print $1" 次のコンプではもっと頑張ってください"}' Grade.txt
5. さまざまな一致
緑または緑と一致:
$ awk '/[Gg]reen/' Grade.txt
と一致$1 の最初の 4 文字は次のとおりです:
$ awk '$1 ~ /^...a/' Grade.txt
黄色または茶色に一致します:
$ awk '$4 ~ /Yellow|Brown/' Grade.txt
それらに一致しますJ Line:
$ awk '$0 ~ /^J/' Grade.txt
6. 複合式
複合パターンまたは複合演算子は、複雑な論理演算を形成するために使用されます。複合演算子の組み合わせです
&& AND: シンボルの両側が同時に true である必要があります
|| OR: シンボルの両側の少なくとも 1 つが true です
: 非反転
! awk '{if ($1 == "P.Bunny" && $4 == "Yellow") print $0}' Grade.txt
$ awk '{if ($4 == "Yellow" || $4 ~ /Brown/) print $0}' Grade.txt
9.2.5 awk 組み込み変数
awk には、環境情報を設定するために使用される多くの組み込み変数があります。ファイル
FS Set で処理されるレコードの行数。フィールド区切り文字、-F
NF と同等 フィー​​ルド内の列数
NR 処理されたレコードの総行数
OFS 出力フィールドのフィールド区切り文字を設定
RS/ORS 改行文字

ARGC サポートコマンドラインで awk スクリプトに渡されるパラメータ。 ARGV は ARGC のパラメータ配置配列で、各要素は ARGV[n] として表されます。n は、アクセスするコマンド ライン パラメータです。ENVIRON は、システムによって設定された環境変数にアクセスするには、実際の変数名を使用します。 ENVIRON[" EDITOR"]=”Vi” など
FILENAME は awk スクリプトによって現在操作されているファイルのファイル名です
FNR は現在 awk によって操作されているファイルのレコード行数であり、その値は常に小さいですNR以上。スクリプトが複数のファイルにアクセスしている場合、この変数は新しい入力ファイルごとにリセットされます
FS はコマンドラインの -F と同じようにドメイン区切り文字を設定するために使用され、デフォルトはスペースです。例: 区切り文字としてコロンを使用します。 FS=":"
NF はレコードのフィールド数 (列数) であり、レコードが読み取られた後に設定されます。 $NF は、最後の列を指定するためによく使用されます
。OFS は出力レコードのフィールド区切り文字を指定します。デフォルトはスペースです。例: FS="-" を出力するための区切り文字として - を使用します
ORS と RS は両方とも出力レコード区切り文字であり、デフォルトは改行 (n) です
例:
ファイル内のレコード数を表示します:
$ awk 'END {print NR }' Grade.txt
すべてのレコード、その行番号、およびフィールドの合計数を出力し、最後に読み取ったファイルのファイル名を出力します:
$ awk '{print NF,NR,$0 } END {print FILENAME}' Grade .txt
少なくとも 1 つのレコードが含まれており、Brown:
$ awk '{if (NR > 0 && $4 ~ /Brown/) print $0}' Grade.txt
の強力な機能NF は、awk に渡す変数 $PWD の値を返し、そのディレクトリを表示します:
$ echo $PWD | awk -F/ '{print $NF}'
ファイル名を表示します:
$ echo "/usr/apache /conf/httpd.conf" | awk -F/ '{print $NF}'
9.2.6 awk 演算子
awk 演算子の基本式は、数値、文字列、変数フィールド、配列要素に分けることができます
= += -= *= /= %= ^= 一致するかどうか)
< <= == != >= + - * / % ^算術演算子
++ -prefix AWK で入力ドメイン変数名
を設定します。意味のあるドメイン名を設定すると、リレーションシップの操作が理解しやすくなります。一般的な変数名の設定方法は name=$n です。ここで、name は呼び出されるドメイン変数の名前、n は実際のドメイン番号です。複数のドメイン名設定はセミコロンで区切ります (以下の ; の使用に注意してください)
$ awk '{name = $1;belts = $4; if (belts ~ /Yellow/) print name" は Belt "belts}" です。 txt
2. フィールド値の比較演算
ある数値フィールドが別の数値フィールドより小さいかどうかをテストするには 2 つの方法があります:
1) BEGIN の変数名に値を代入します
2) 関係演算子で実際の値を使用します
通常、BEGIN での部分代入は非常に有益であり、awk 式に変更を加えるときに多くの手間を省くことができます。関係演算を使用する場合は、かっこを使用する必要があります。例:
すべての競技会で 27 点未満の得点をとったすべての生徒をクエリします:
$ awk '{if ($6 < 27) print $0}' Grade.txt
または
$ awk 'BEGIN {BASELINE = "27"} { if ($6 < BASELINE) print $0}' Grade.txt
3. 数値フィールドの値を変更します
awk のフィールドを変更する場合、実際の入力ファイルは変更できないことを覚えておくことが重要です。キャッシュ内の awk のコピー。 Awk は変数 NR または NF の変更トレースを反映します。数値フィールドを変更するには、フィールド識別子を新しい値に再割り当てするだけです。例:
$ awk '{if ($1 == "M.Tansley") $6 = $6 - 1; print $1,$6,$7}' Grade.txt
4. テキストフィールドを変更するということは、テキストフィールドを再割り当てすることを意味します。 、新しい文字列に割り当てられます。文字列には二重引用符を使用し、構文全体ではかっこを使用することを忘れないでください。例:
$ awk '{if ($1 == "J.Troll") ($1 = "J.L.Troll"); print $1}' Grade.txt
5. ファイルが大きい場合、変更されたレコードのみを表示します。レコードはたくさんあるので、変更された部分だけを見れば大丈夫です。パターンの後に中括弧 {} を使用すると、変更された部分のみが出力されます。パターンを取得し、パターンの結果に基づいて操作を実行します。例: (中括弧の位置に注意してください)
$ awk '{if ($1 == "J.Troll") {$1 = "J.L.Troll"; print $1}}' Grade.txt
6 新しい出力を作成します。フィールド
awk でデータを操作する場合、各フィールドに基づいて計算を実行するときに新しいフィールドを作成することをお勧めします。新しいドメインを作成するには、新しいドメイン識別子を別のドメインに割り当てる必要があります。例:
grade.txt に新しいドメイン 8 を作成し、ドメインの現在のレベル スコアとドメインの最高レベル スコアの差を保存します:
$ awk 'BEGIN {print "NametDifference"} {if ($6 < $7) {$8 = $7 - $6; print $1,$8}}' Grade.txt
またはわかりやすい変数名を付けてください:
$ awk 'BEGIN {print "NametDifference"} {if ($6 < $7) {diff = $7 - $6; print $1, diff}}' Grade.txt
7. 列の値を増やす
列の数を増やすか、実行結果の統計を実行するには、記号 += を使用します。シンボルの右側の変数フィールドの値を左側に代入します。
例:
全生徒の合計スコアを出力します (ファイル全体の $6 を合計します。合計は変数名です):
$ awk '(total += $6) END {print "Club Student total Points: "total; }' 成績.txt
ファイルが大きく、すべてのレコードではなく結果部分のみを出力したい場合は、ステートメントの外側に中かっこ {} を追加します。
$ awk '{(total += $6)} END {print "Club students total Points: "total}' Grade.txt
現在のディレクトリ (サブディレクトリを除く) にあるすべてのファイルのサイズと合計を表示します:
$ ls -l|awk '/^[^d]/ {print $9"t"$5} {total += $5 } END {print "total Bytes: "total}'
9.2.9 組み込みの文字列関数
awk には多くの強力な文字列関数があります:
gsub(r,s,t) 文字列 t 全体で文字列 s を使用します。正規表現 r を満たすすべての文字列 (t が指定されていない場合、デフォルトは $0)
index(s,t) 文字列 s 内で文字列 t が最初に出現する位置を返します (存在しない場合は 0 です) )
length(s) s 文字列の長さを返します (s が指定されていない場合、デフォルトは $0)
match(s,r) s 文字列内の正規表現 r を満たす最初の文字列の位置を返します (一致するものがない場合は 0)
split(s,a,sep) sep を使用して文字列 s を配列 a の要素に分割し、配列要素の数を返します (区切り文字が指定されていない場合、デフォルトはFS と同じ)
sprint("fmt ",exp) printf の書式設定命令を使用して、式 exp の出力を書式設定します。
sub(r,s,t) 正規表現 r を満たす最初の文字列を、正規表現内の s 文字列に置き換えます。 string t を返し、成功した場合は 1 を返します。成功した場合は 0 を返します (t が指定されていない場合は、デフォルトで $0 になります)
substr(s,p,n) 文字列 s の位置 p から始まる長さ n の文字列を返します (n が指定されていない場合)指定されていない場合は、位置 p から開始して返します) で始まるすべての文字列
to lower(s) 文字列 s 内のすべての大文字を小文字に変換し、変換後の文字列を返します
toupper(s) 文字列 s 内のすべての小文字を大文字に変換し、変換結果を返します結果の文字列
1. gsub(r,s,t)
文字列 t 全体の正規表現 r を満たすすべての文字列を文字列 s に置き換えます (t が指定されていない場合は、デフォルトで $0 になります):
$ awk 'gsub (/4842/,4899) {print $0}' グレード.txt
or
$ awk '{if (gsub(/4842/,4899)) print $0}' グレード.txt
2.文字列 s 内で文字列 t が最初に出現する位置を返します (存在しない場合は 0)。文字列は二重引用符で囲む必要があります:
$ awk 'BEGIN {print index("Benny","ny")}' Grade.txt
3. length(s)
は s 文字列の長さを返します (そうでない場合)。 s が指定されている場合、デフォルトは $0):
$ awk '$1 == "J.Troll" {print length($1)" "$1}' Grade.txt
$ awk 'BEGIN {print length("ケビンは良いですboy. ")}'
4. Match(s,r)
s 文字列内の正規表現 r を満たす最初の文字列の位置を返します:
$ awk 'BEGIN {print match("ANCD",/d/ )}' (0 を返す)
$ awk '$1=="J.Lulu" {print match($1,/u/)}' Grade.txt (J.Lulu の最初の u の位置を返す: 3)
5. split(s,a,sep)
sep を使用して文字列 s を配列 a の要素に分割し、配列要素の数を返します:
$ awk 'BEGIN {print split("123#456#789" ,array, "#")}'
は 3 を返します。配列 array の要素は次のとおりです:
array[1]="123"
array[2]="456"
array[3]="789"
6 . sub(r ,s,t)
正規表現 r を満たす最初の文字列を文字列 t の s 文字列に置き換え、成功した場合は 1 を返し、それ以外の場合は 0 を返します (t が指定されていない場合、デフォルトは $0)。
$ awk '$1 == "J.Troll" {if (sub(/26/,"29")) print}' Grade.txt
7. substr(s,p,n)
文字列 s を返します。 p 位置から始まる 長さ n の文字列 (n が指定されていない場合、位置 p から始まるすべての文字列が返されます):
$ awk '$1 == "L.Tansley" {print substr($1,1,5)}' Grade.txt (L.Tan を返す)
指定された長さの値 n が文字列の長さより大きい場合、awk は開始位置からのすべての文字を返します:
$ awk '$1 == "L.Tansley" {print substr($1 ,3,15 )}' Grade.txt (タンスリーに戻る)
n が指定されていない場合、awk は開始位置からすべての文字を返します:
$ awk '{print substr($1,3)}' Grade.txt
BEGIN 部​​分の文字列で文字を定義し、END 部分で抽出した文字を返します:
$ awk 'BEGIN {STR="ケビンは良い子です。"} END {print substr(STR,12,8)}' Grade.txt
8. シェルから awk は文字列を渡します
$ echo "Stand-by"|awk '{print length($0)}'
ファイル名を変数に設定し、ファイル名を取得します:
$ STR="grade .txt」
$ echo $STR|awk '{print substr($STR,1,5)}'
ファイル名のサフィックスを取得します:
$ STR="grade.txt"
$ echo $STR|awk '{print substr($STR , 7) }'
9.2.10 awk 出力関数 printf
awk は、いくつかの異なる形式の出力関数を持つ関数 printf を提供します。各 printf 関数 (制御フォーマット文字) は % 記号で始まり、変換を決定する文字で終わります。変換には 3 つの修飾子が含まれています。 R 文法: inPrintf "フォーマット制御文字"、パラメーター

AWK Printf の形式に応じて
-左对幅ドメインのステップ、0 を使用して .pruc の最大文字列長、または小さい文字列の右側の桁数を示します数値

awk printf 形式
%c ASCII 文字
%d 整数
%e 浮動小数点 (科学的表記法)
%f 浮動小数点
%g awk はどの浮動小数点変換 (e または f) を使用するかを決定します
%o 8 進数
%s 文字列
%x 16 進数
例:
文字変換:
$ awk 'BEGIN {printf "%cn",65}' Grade.txt
フォーマットされた出力:
すべての生徒の名前とシリアル番号を出力します。名前は次のとおりです。左揃えにする必要があり、長さは 15 文字で、その後にシリアル番号が続きます:
$ awk '{printf "%-15s %sn",$1,$3}' Grade.txt
コメントを追加:
$ awk 'BEGIN { print "NamettNumber"} {printf "%-15s %sn",$1,$3}' Grade.txt
9.2.11 awk コマンドの行に値を渡す
awk を実行する前に awk 変数に値を渡す必要があります。コマンドラインでの形式は次のとおりです:
awk コマンド変数 = 入力ファイルの値
例:
$ awk '{if ($5 < AGE) print $0}' AGE=10 Grade.txt
クエリパーティション空き容量が 36000M 未満:
$ df -m|awk '($4 ~ /^[0-9]/) {if ($4 < LIMIT) print $6"t"$4}' LIMIT=36000
awk は環境も許可します渡される変数。例:
現在のユーザーがログインしているポートを問い合わせます:
$ who|awk '{if ($1 == user) print $1" you are Connected to "$2}' user=$LOGNAME
9.2.12 awk スクリプト ファイル
は awk スクリプトによってファイルに書き込まれ、それが実行されます。 awk スクリプトを使用する利点は、使用するたびにスクリプトを再入力する必要がないことと、理解しやすいようにコメントを追加できることです。 awk スクリプトを例に挙げます:
#!/bin/awk -f
# すべてのコメント行はハッシュ '#' で始まる必要があります
# name:student_total.awk
# 呼び出し先:student_total.awk Grade.txt
#クラブ生徒のポイントの合計と平均を出力します

# 最初にヘッダーを出力します
BEGIN{
print "StudentttDatetNumbertGradetAgetPointstMax"
print "NamettJoinedttttGainedtPoint available"
print "================== == =============================================== == ==="
}

# 獲得ポイントのスコアを加算しましょう
(合計 += $6)

# 処理が完了しました。合計ポイントと平均ポイントを出力しましょう
END {
print "Club Student Total Points: " total
print "Average Club Student Points: " total/NR
}
最初の行は #!/bin/awk -f です。この行がないと、スクリプトは実行されません。システム内の awk の場所。コマンドを分離することでスクリプトの可読性が向上し、コマンド間にコメントを追加することができます。
実行時にスクリプト ファイルの後にファイル名を入力しますが、最初に実行権限を付与する必要があります。
9.2.13 awk での FS 変数の使用
awk スクリプトを使用する場合、FS 変数の設定は BEGIN セクションで行われます。そうでない場合、awk はドメイン区切り文字が何であるかを認識できません。
スクリプト例: (このスクリプトは /etc/passwd から最初と 5 番目のフィールドを抽出します)
#!/bin/awk -f
# 呼び出し: passwd.awk /etc/passwd
# 最初と 5 番目のフィールドを出力します
BEGIN {
FS=":"}
{print $1,"t",$5}

9.2.14 awk スクリプトに値を渡す
awk スクリプトに値を渡すことは、値を渡すこととほぼ同じです。 awk コマンドラインに入力し、形式:
awk_script var=value input_file
例:
#!/bin/awk -f
# name: age.awk
# 呼び出し先: age.awk AGE=n Grade.txt
# コマンドラインで指定した年齢よりも低い年齢を出力します
{if ($5 < AGE)
print $0}
実行方法: (最初に実行許可を与えることを忘れないでください)
$ ./age.awk AGE=10 Grade.txt
パイプラインを使用することもできます。 コマンドは、
$ cat Grade.txt |./student_total.awk などの awk スクリプトにコマンドの結果を渡します
9.2.15 awk array
配列は、使用前に定義する必要はなく、配列要素の数を指定する必要もありません。ループは配列にアクセスするためによく使用されます。以下はループ タイプの基本構造です:
for (配列内の要素) print array[element]
例: (前述の文字列 123#456#789)
#!/ bin /awk -f
# name: arraytest.awk
# 配列を出力します
BEGIN {
record="123#456#789";
split(record,array,"#")
}
END {
for (i in array) {
print array[i]
}
}
使用/dev/null作為输入运行脚本:
$ ./arraytest. awk /dev/null

从指定文本里出一致条件の项およびその出てくる次数
#!/bin/awk -f
# name: count.awk
# 呼び出し先: count.awk Grade2.txt
# Grade2.txt ファイルをループして、ベルト (黄色、オレンジ、赤) の数を数えます
# 大人とジュニアの数も数えます
# BEGIN の開始
# FS を設定し、値を含む配列をロードします
BEGIN {FS="#"
# 関心のあるベルトの色のみをロードします
belt["Yellow"]
belt["Orange"]
belt["Red"]
# BEGIN の終わり
# 生徒をロードしますtype
student["Junior"]
student["Senior"]
}
# フィールド 1 に対してベルトの色を保持する配列をループします
# 一致する場合は、現在までの合計を記録します
{for (ベルトの色) )
{if ($1 == colour)
Belt[colour]++}}
# 学生タイプを保持する配列をループします
# field-2 一致する場合は、現在までの合計を記録します
{for (senior_or_junior in Student)
{if ($2 == Senior_or_junior)
Student[senior_or_junior]++}}

# 処理が終了したので、配列ごとに一致を出力します
END {for (ベルトの色) print "The club has ", Belt[colour], colour, "ベルト"

for (学生のsenior_or_junior) print "The club has",student[senior_or_junior], Senior_or_junior, "students"}
BEGIN部分设置領域分周符是#,初化两その後、色として指定されたファイルが処理され、$1 がその数グループのいずれか (黄色、オレンジ、または赤) に等しいかどうかを循環句比較を使用して判断し、一致する場合は、その要素に応じてその数グループの数値が保持されます。 END 部分は、各数値グループに対して循環句を使用して、awk のいくつかのテクニック スキームを出力します。 ...] awkの常用オプションオプション:
① -F fs : 入力ファイルのフィールド区切りとして fs を使用します。このオプションを省略した場合、wak は環境変数 IFS の値を使用します。

② -f filename : 文書ファイル名から awk_script を取得します。

③ - v var=value : awk_script の設定量です。

1、重複する行を削除します

#awk '!a[]++'

2、データファイル内の各命令の最初の文字を変更します。大写

dingyi@backup:~$ cat test

Linuxは長生きです!!! 

私はキューです

dingyi@backup:~$ awk ',1,1); sub(/^./,toupper(first),); print }' test
Linux は長生きです!!! 
私はキューです

awk请教

下は文件一、文件二
$cat file1

00001 20

00002 31

00003 04

00004 56
00005 94
00006 73
00007 25
00008 86
00009 19
00010 52

$cat file2
00001 20
00007 28
00002 32

00004 56

00010 52

怎样のシェル才能を使用してfile1、file2の2つのファイルの$2異なる话、取り出し全局$0?
注意:比较两个文件 $2 的候時,必要第一列同的情况下才比较

请大虾执教

li2002 2003-9-11 08:57

awk アドバイスを求めてください

異なる行を見つけるためだけではありませんか?
cat file1 file2|sort |uniq -u

deathcult 2003-9-11 09: 15

awk アドバイスを求めます

paste file1 file2|awk '{if(($1==$3)&&($2!=$4))print$0}'

bjgirl 2003-9-11 09:38

awkアドバイスください

[code]
# !/bin/ksh
sort -n file1>nf
sort -n file2>mf
paste nf mf|awk '$1=$3 {print}'|awk '$2!=$4 { print}'
rm nf mf
結果:
00002 31 00002 32
00004 04 00004 56
00007 56 00007 28
00010 94 00010 52
[/code]

キルア2003-9-11 10:05

awk 質問するアドバイスを求めて

1階に戻って、私は最近Laのawkを学んでいます、そしてあなたが得る値は
00002 31
00002 32
00003 04
00005 94
00006 73
00007 25
00007 28
00 008 86
00009 19
0 0010 52
00010 52
そして私が欲しいのは
00002 31 32
00007 25 28


2階には値がなく、貼り付ける必要があります file1 file2|awk '{if ($1 == $3 && $2 != $4) print $0}'[/quote]


awk 教えてください

3階の答えが間違っていたら

[color=red]00002。 31 32
00007 25 28
[/color]
同じ $1 と異なる $2 を列挙してください

admirer 2003-9-12 00:45

awk アドバイスしてください

これは問題ではありません。ペーストするだけで解ける問題ですが、キーワードでつながる問題です!
[code]sort file1 >f1;sort file2 >f2; join -j1 1 f1 f2|awk '$2 != $3'
00002 31 32
00007 25 28[/code]

killua 2003-9-12 03:30



awk アドバイスを求めてください

[引用][i]「yoof」による元の投稿]join -j1 1 f1 f2 説明してください[/引用 投稿者:[/i]

最初のone ファイルの最初のフィールドは、2 つのファイル f1 と f2 を接続するインデックス キーです

ファイル処理

1。 gz.txt ファイルがあります (給与)

4367422926350133100 Zhang San 1250.00

4367422926351220178 Li Si 1300.00

4367422926351220546 Wang Er 0

Su Wubing 1340.00

4367422926351220178 Sun June 1390.00

………

要件: を押してください口座番号は19桁、氏名は8桁、給与は8桁未満の場合はその後に、給与が8桁未満の場合はその後に記入します。給料の前に。同時に、給与が 0 のリストを削除する必要があります。アカウントがない場合は、前に 19 個のスペースを追加し、検証用に合計給与を出力します。

のように配置されます。 4367422926350133100 張三 1250.00

4367422926351220178 李思 1300.00

蘇武兵 1 340.00

4367422926351220178日曜日90.00

………

awkプログラム:

#---------------- ---------------- ------

#shgz1.sh

sblank=" "

awk '$nf!="0"' $1 > .txt #給与が0の人の数を削除

awk '<

if($1!~/[0-9]/)<

printf("%-19.19s%-8.8s% 8.2fn","'"$kk"'",$1,$2)> # アカウントがない場合はスペースを埋めてください

else<

printf("%-19.19s%-8.8s%8.2fn ",$1,$2,$3)>

>' tmp.txt > $2

awk '$nf~/[0-9]/
sum=sum+$nf

> end<

system("rm tmp.txt")

printf("the sum is%16.2f !n", sum) #給与総額を出力する

> $2


awk でシステム変数を呼び出すとき二重引用符の場合は、文字列

Flag=abcd

awk '{print '$ Flag'}' の結果は abcd
awk '{print "$Flag"}' の結果が $Flag になることを意味します。



一致行間のコンテンツを削除するが、一致する行は含まない方法

そのようなファイルがあります:
Query=4567879
sequence jkaskdjgkjasgasa;jghsafgkas
jfaklslgjdla;;gsdakl;gd

E
PUT-ASD-WEETED-0 01
PUT-ASD-WEQER5-001789
>PUT-ASD- ウィーテッド-001
SDAGDSDS
>PUT-ASD-WEQER5-001789
DSGTSDTEW
...
...
...
これです、スコアEから
を削除したいです
1行目から始まるすべての行へ> ただし、スコア E 行と > で始まる最初の行は除外します
sed '/score E/,/^>/d' urfile を使用します
間違いなく、スコア行 E と>?で始まる最初の行
書き方は?
処理対象のファイルに複数の楽譜が含まれている場合、E から最初の > で始まる行までが削除されます。


awk -v p=1 '/score/{p=0}/>/{p=1}p' urfile



awk コマンドと例の関連記事の詳細については、以下を参照してください。 PHPの中国語サイトです!


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。