AWK は、一致する文字が出るまで行をスキップしてから計算を実行します。

AWK は、一致する文字が出るまで行をスキップしてから計算を実行します。

次の構造のファイルが2つあります。

ファイル1:

# Some comments on the file
# I am a line
# I am a new line
# I am yet a new line
 
# A value in the next line
123
Values
(
1
2
3
4
5
)

ファイル2:

# Some comments on the file
# I am a line
# I am a new line

# A value in the next line
123 
Values
(
1.1
2.1
3.1
4.1
5.1
)

予想される結果は絶対的な違いを持つファイルです。

0.1
0.1
0.1
0.1
0.1

2つのファイル間の括弧内の値の絶対的な違いを知りたいです。

現在、私は次の機能を持っています。

foo()
{
    paste $1 $2 | awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($1 - $2)}' > outputFile
}

これはうまくいきますが、すべてのファイルをチェックします。ヘッダーが一致しない場合、問題が発生します。開き括弧を見つけた後にのみ関数を適用するようにawkに指示する方法はありますか?

ありがとう

答え1

関数を作成して使用する方法を既に知っているので、abs()ここに追加してください。

$ awk '
    /\(/{f=1; next} /)/{f=0} !f{next}
    NR==FNR { file1[++a]=$0; next }
    { print $0 - file1[++b] }
' file1 file2
0.1
0.1
0.1
0.1
0.1

答え2

このように:

foo() {
    paste $1 $2 | awk -F'\t' '
        function abs(x){return ((x < 0.0) ? -x : x)}
        /\(/{f=1}
        /\)/{f=0}
        (f) {print abs($1 - $2)}
    ' > outputFile
}

答え3

メモ:コメントに括弧が含まれている場合は、追加の処理が必要です。早期に削除またはスキップできます。

バリアント番号1

awk -F'\n' '
function abs(n) {
    return (n < 0) ? -n : n
}

NR == 2 {
    for(i = 2; i < NF; i++) {
        arr[i] = $i
    }
}

NR == 5 {
    for(i = 2; i < NF; i++) {
        print abs(arr[i] - $i)
    }
}
' RS='[)(]' file_1.txt file_2.txt

説明する

RS='[)(]'改行ではなく括弧でレコードを区切ります。したがって、次のような例を次に示します。

some text\nValues(\nnum1\nnum2\nnum3\n...)\n

結果は次のとおりです(括弧が消えます)。

record1              record2                    record3
some text\nValues    \nnum1\nnum2\nnum3\n...    \n

-F'\n'フィールドを改行で区切ります。分ける記録2次のようになります。

'empty' num1    num2    num3   ...
field1  field2  field3  field4 ...

亜種2

awk '
function abs(n) {
    return (n < 0) ? -n : n
}
!/\)/{
    print abs($1 - $2)
}
' <(paste -d' ' <(sed '1,/(/d' file_1.txt) <(sed '1,/(/d' file_2.txt))

答え4

sed -n -e '/(/,/)/p' file1|sed -e '1d' -e '$d' >file1_1
sed -n -e '/(/,/)/p' file2|sed -e '1d' -e '$d' >file2_1
paste file1_1 file2_1| awk '{print $2-$1}' >file3

出力

cat file3
0.1
0.1
0.1
0.1
0.1

関連情報