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

두 파일 사이의 괄호 안 값의 절대적인 차이를 알고 싶습니다.

현재 나는 다음과 같은 기능을 가지고 있습니다.

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

관련 정보