次の構造のファイルが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