ファイル内容:File1
1 a
2 b
3 c
...
-----ファイル2
2 a
2 c
2 d
...
awkはコンマで区切られた次の形式を受け入れます。
1 a,2 a
2 b,2 c
...
paste -d, File1 File2 | awk -F, '{n=NF/2;s=""; for (i=1;i<=n;i++){printf "%s%s", s, ($i-$(i+n));s=",";}; print ""}'
私はこの行を使用して最初のフィールドに1行ずつ違いを与えます。最初の行は1-2なので、-1を印刷します。
さて、大丈夫です。正解を得ましたが、フィールドが-Fで区切られたときに数値フィールドをどのように選択するかはまだわかりません。
1 a
私が変わったら
1 a
到着
a 1
残りの部分と同じことを行うと動作しません。論理的に同意します。つまり、フィールドが数値と文字の場合、どのように数値を取得しますか? $i = 数字、文字はなぜできないのですか?
答え1
フィールドが数字と文字の場合、どのように数字を取得しますか?
,
フィールド区切り記号()の場合、-F,
同様のテキスト2 a
は単一のフィールドであり、数値として使用される場合は単に数字2として扱われます。
AWK言語は、文字列を数値として扱うように要求するときに非常に寛大です。もはや数字として理解されなくなるまで文字列を読みます。その時点で何でも意味があるなら、それはあなたの電話番号です。それ以外の場合はゼロとして扱います。算術式に文字列を使用すると、すべてが自動的に発生します。動作方法を確認するには、次の手順を実行します。
awk '{print $0 + 0}'
$0
フルラインです。 0 を追加すると数値として解釈されますが、数値が何であるかは変わりません。その後、入力行を入力して数値がどのようawk
に処理されるかを確認できます。たとえば、空の文字列は0、3、1、3.4などであること3a
が1 2
わかり3.4.5.6
ます。 (Ctrl行の先頭で+を押すと入力が終了し、抜け出すか+を直接押すだけです。)Dawk
CtrlC
実際に実行したい操作に応じて、そのコマンドが実行する操作と動作をより明確に説明し、より簡単に修正できる簡単なコマンドを作成できます。例えば、各ファイルにスペースで区切られた2つの列のみがあり、アイテム自体にスペースが含まれていない場合は、実行せずにpaste
(-d
または必要に応じて同様の使用)、テーブルを4列テーブルにマージし、-d ' '
テーブルを次のようにパイプしません。awk
-F
paste File1 File2 | awk '{print $1 - $3}'
これにより、数字が文字の前ではなく後ろに表示されるときにAWKスクリプトを調整する方法が明らかになります。
paste File3 File4 | awk '{print $2 - $4}'
File3
(これをテストするには、トグル列を使用してそれぞれmakeとFile4
fromを使用できますFile1
。たとえば、make。)File2
awk
awk '{print $2, $1}' File1 > File3
File3