다음 구조의 파일이 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