awk 2つのファイルからパイプライン計算を貼り付ける -d

awk 2つのファイルからパイプライン計算を貼り付ける -d

ファイル内容: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などであること3a1 2わかり3.4.5.6ます。 (Ctrl行の先頭で+を押すと入力が終了し、抜け出すか+を直接押すだけです。)DawkCtrlC


実際に実行したい操作に応じて、そのコマンドが実行する操作と動作をより明確に説明し、より簡単に修正できる簡単なコマンドを作成できます。例えば、各ファイルにスペースで区切られた2つの列のみがあり、アイテム自体にスペースが含まれていない場合は、実行せずにpaste-dまたは必要に応じて同様の使用)、テーブルを4列テーブルにマージし、-d ' 'テーブルを次のようにパイプしません。awk-F

paste File1 File2 | awk '{print $1 - $3}'

これにより、数字が文字の前ではなく後ろに表示されるときにAWKスクリプトを調整する方法が明らかになります。

paste File3 File4 | awk '{print $2 - $4}'

File3(これをテストするには、トグル列を使用してそれぞれmakeとFile4fromを使用できますFile1。たとえば、make。)File2awkawk '{print $2, $1}' File1 > File3File3

関連情報