다음 파일을 고려하십시오.
file1
:
boo,8,1024
foo,7,2048
file2
:
foo,0,24,154
noo,0,10,561
file3
:
24,154,7,1024,0
내가 필요한 건 가는 거야파일 1그리고 $2==7
true인지 확인 $1
하고 ,$2
$3
파일 1;이제 비교해야 합니다 $1
.파일 1$1
와 같음파일 2;사실이라면, 나는 $3
다음을 취해야 합니다.$4
파일 2에는 존재하지 않습니다파일 1, 그럼 나 가야 해파일 3그리고 $1
그것이 나오는지 확인하십시오파일 3$3
와 같음파일 2, 그리고 $2
에서파일 3$4
와 같음파일 2;그렇다면 내가 보낸 것인지 확인해야 합니다 $2
.파일 1$3
와 같음파일 3, 그러면 이 조건이 true이면 $3
비교 해야 합니다.파일 1$4
와 함께파일 3, 만약 $3
에파일 1$4
에서 보다파일 3.
다음 스크립트를 시도했습니다.
cat [file1] [file2] [file3] |
awk -F,
'{if(NF==3)
{if($2==7){a[$1]=$1; b[$1]=$2; c[$1]=$3}
}else
{if(NF==4){if(a[$1]==$1){d[$3]=$3; e[$4]=$4}
}else
{if(NF==5){if(d[$1]==$1 && e[$2]==$2){print a[$1], b[$1], c[$1], d[$1]}}
}
}
}'
원하는 출력은 다음과 같습니다.
foo,7,2048,24,154,1024
답변1
이것은 나에게 효과적입니다.
awk -F, 'FNR==1{++f} \
f==1 && $2==7 {a1[$1]++; a2[$2]=$3; o=$0} \
f==2 && a1[$1] {o=o","$3","$4; a3[$3]=$4} \
f==3 && a3[$1] && $2==a3[$1] && a2[$3] && $4<a2[$3] {print o}' \
file1 file2 file3
설명하다:
- 첫 번째 줄(
FNR==1{++f}
)은 파일 인덱스를 증가시켜 나중에 우리가 1-3에 있는 파일을 결정합니다. - 파일 1:만약
$2
같다면7
a1
$1
인덱스,a2
인덱스$2
,$3
값 으로 배열 채우기o
변수의 처음 3개 필드 작성 (출력)
- 파일 2:같음
$1
(file2
이전에 작성됨)$1
file1
a1
- 출력 변수에
$3
합계를 추가합니다 .$4
o
a3
$3
인덱스와 값으로 배열을 채웁니다$4
.
- 출력 변수에
- 파일 3:만약에:
$1
file2s와 동일$3
(색인a3
)$2
file2s와 동일$4
(값a3
)$3
file1s와 동일$2
(색인a2
)$4
file1s 아래$3
(값a2
)
- 그 다음에:
- 인쇄된 값입니다
o
.
- 인쇄된 값입니다
답변2
TXR 솔루션:
@(repeat)
@id,@val0,@val1
@ (next)
@ (skip)
@id,@nil,@val2,@val3
@ (next)
@val2,@val3,@val0,@val4,@val5
@ (require (< (int-str val4) (int-str val1)))
@ (output)
@id,@val0,@val1,@val2,@val3,@val4
@ (end)
@(end)
달리기:
$ txr join.txr file1 file2 file3
foo,7,2048,24,154,1024
그러나 기민한 관찰자는 코드 어디에도 7이 지정되지 않고 출력에만 나타나는 것을 알 수 있습니다! 이는 코드가 실제로 file1
및일치 및 제약조건을 만족하는 모든 조합을 인쇄합니다.. 샘플 데이터에 포함된 유일한 val0
데이터 입니다 7
.
더 많은 조합이 발견되면 7
다음과 같은 조합으로 제한될 수 있습니다.
$ txr -Dval0=7 join.txr file1 file2 file3
foo,7,2048,24,154,1024
# how about 6?
$ txr -Dval0=6 join.txr file1 file2 file3
# no output
TXR 패턴 추출 언어는 여러 줄의 추출 패턴과 비텍스트 제약 조건, 출력 등과 같은 삽입된 부작용을 사용하여 여러 파일에 걸쳐 변수 이름을 반복함으로써 암시적 역참조와 일치하는 대규모 패턴을 제공합니다.
신중하게 번역된 TXR Lisp awk 솔루션을 수락하세요.awk
매크로:
(awk (:begin (set fs "," ofs ","))
(:let o (a1 (hash :equal-based)) (a2 (hash)) (a3 (hash)))
(t (mf [orf int-str identity])) ;; map those fields to integers, which can be
((and (= arg 1) (= [f 1] 7)) (inc [a1 [f 0] 0])
(set [a2 [f 1]] [f 2])
(set o rec))
((and (= arg 2) [a1 [f 0]]) (set o `@o,@[f 2],@[f 3]`)
(set [a3 [f 2]] [f 3]))
((and (= arg 3)
[a3 [f 0]]
(= [f 1] [a3 [f 0]])
[a2 [f 2]]
(< [f 3] [a2 [f 2]])) (prn o)))
달리기:
$ txr awkit.tl file1 file2 file3
foo,7,2048,24,154
,1024
필요한 부분이 출력에서 누락되었습니다. 원본 "Awk Classic"에는 이러한 동작이 있었습니다.