입력: 탭으로 구분된 두 개의 파일 File1
과 File2
. File2
( $2
)는 File1
( ) $1
에 있는 패턴으로 구문 분석되어야 합니다.
예상 출력: 탭으로 구분된 파일인 . File3
에는 . File3
와 동일한 줄과 File2
패턴이 일치하는 경우 해당 값 File1
(줄 끝, 탭으로 구분)이 포함되어야 합니다.
파일 1(탭으로 구분):
ABC1 1 3
ABC2 4 3
ABC3 3 2
ABC4 3 3
파일 2(탭으로 구분):
text1 ABC1-AB text2 text3
text2 ABC2-AB text1
text3 ABC1-CD text2
text4 ABC5-AB text3 text4
파일 3:
text1 ABC1-AB text2 text3 1 3
text2 ABC2-AB text1 4 3
text3 ABC1-CD text2 1 3
text4 ABC5-AB text3 text4
답변1
그리고 awk
:
awk 'FNR==NR{a[$1]=$2"\t"$3} FNR!=NR{split($2,b,"-"); $0=$0"\t"a[b[1]];print}' file1 file2
FNR==NR
첫 번째 파일의 경우file1
:a[$1]=$2"\t"$3
a
두 번째와 세 번째 필드로 배열을 채우고 첫 번째 필드를 인덱스로 사용합니다.
FNR!=NR
두 번째 파일의 경우file2
:split($2,b,"-")
에서 두 번째 필드를 분할합니다-
.$0=$0"\t"a[b[1]]
행에 두 개의 값을 추가합니다.print
이 줄을 인쇄하세요.
산출:
text1 ABC1-AB text2 text3 1 3
text2 ABC2-AB text1 4 3
text3 ABC1-CD text2 1 3
text4 ABC5-AB text3 text4
답변2
테스트에는 BASH를 사용하십시오.
while read LINEFILE2
do
printf "$LINEFILE2" >> File3
while read LINEFILE1
do
read PATTERN ADDITIONS <<EOF
$LINEFILE1
EOF
[ ! -z "$PATTERN" ] && [ ! -z $(echo "$LINEFILE2" | cut -f2 | grep "$PATTERN") ] && {
printf "\t$ADDITIONS\n" >> File3
}
done < File1
done < File2
열 2만이 아닌 전체 행 내부에서 패턴을 찾으려면 cut
파이프 구조에서 명령을 가져올 수 있습니다.