awk 다 중 파일 조작 2 가지 실현 방법

5149 단어 shell각본
우 리 는 항상 관련 텍스트 파일 두 개 를 합 쳐 처리한다.각각 다른 파일 에서 필요 한 열 을 가 져 온 다음 전체 출력 을 함께 합 니 다.awk 에서 다 중 파일 처 리 를 할 때 두 가지 문제 가 자주 발생 합 니 다. 첫 번 째 는 여러 파일 을 하나의 파일 로 통합 하 는 방법 입 니 다.두 번 째 문 제 는 여러 줄 을 한 줄 로 합 쳐 표시 하 는 방법 입 니 다.제 가 처리 하 는 두 가지 방법 과 실현 방향 을 말씀 드 리 겠 습 니 다.
 
인 스 턴 스 텍스트:
1
2
3
4
5
6
7
8
9
10
11
12
13 [chengmo@centos5 shell]$ awk   'FNR==1{print "\r
"FILENAME}{print $0}'
  a.txt b.txt           
  a.txt 100     wang    man 200 wangsan woman 300 wangming man 400 wangzheng man
  b.txt 100 90 80 200 80 70 300 60 50 400 70 20
 
결 과 를 병합 해 야 합 니 다:
100     wang    man 90  80 200 wangsan woman 80    70 300 wangming man 60     50 400 wangzheng man 70    20
 
 
awk 다 중 파일 조작 방법 1: 실현 방향:
외부 명령 을 통 해 파일 을 병합 한 다음 정렬 을 통 해 awk 를 통 해 병합 작업 을 합 니 다.
우선:
1
2
3
4
5
6
7
8
9 [chengmo@centos5 shell]$ cat   a.txt b.txt | sort   -n -k1 | awk   '{print}' 100 90 80 100     wang    man 200 80 70 200 wangsan woman 300 60 50 300 wangming man 400 70 20 400 wangzheng man
지금 은 첫 번 째 열 과 같은 처 리 를 한 줄 로 합 쳐 야 합 니 다. 여 기 는 "next"문 구 를 사용 해 야 합 니 다.이 동작 은 awk 다 중 줄 통합 [next 사용 소개] (일반적인 응용 4) 을 참고 할 수 있 습 니 다.
계속:
1
2
3
4
5 [chengmo@centos5 shell]$  cat   a.txt b.txt | sort   -n -k1 | awk    'NR%2==1{fd1=$2"\t"$3;next}{print $0"\t"fd1}'      100     wang    man       90      80 200 wangsan woman       80      70 300 wangming man          60      50 400 wangzheng man         70      20
 
몇 줄 을 합 쳐 야 합 니 다. 자주 사용 하 는 방법 은 NR% num 입 니 다. 그리고 줄 값 을 저장 합 니 다. next 줄 입 니 다.출력 할 때 출력 합 니 다.
 
awk 다 중 파일 조작 방법 2 사고의 방향 을 실현 하 다.
세 번 째 도구 로 열지 않 고 awk 를 통 해 여러 파일 을 엽 니 다.그리고: FILENAME 를 통 해 현재 처리 파일 이름 을 얻 을 수 있 습 니 다.NR 총 기록 FNR 현재 파일 기록 및 ARGC 입력 매개 변수 총수, ARGV 는 배열, 각 매개 변수 값 입 니 다.
이 실례 들 을 보십시오.
1
2
3
4
5
6
7
8
9
10 [chengmo@centos5 shell]$ awk   'BEGIN{print ARGC,ARGV[0],ARGV[1],ARGV[2]}{print FILENAME,NR,FNR,$0}'   a.txt b.txt                       3 awk   a.txt b.txt a.txt 1 1 100   wang    man a.txt 2 2 200 wangsan woman a.txt 3 3 300 wangming man a.txt 4 4 400 wangzheng man b.txt 5 1 100 90 80 b.txt 6 2 200 80 70 b.txt 7 3 300 60 50 b.txt 8 4 400 70 20
프로그램 코드:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 [chengmo@centos5 shell]$ awk   ' BEGIN{ if (ARGC<3) {    exit   1; }
  file = "" ; } { aData[FILENAME,$1]=ARGV[1]==FILENAME?$0:$2 "\t" $3; } END{ for (k in   aData) {      split (k,idx,SUBSEP);      if (idx[1]==ARGV[1] && (ARGV[2],idx[2]) in   aData)      {          print aData[ARGV[1],idx[2]],aData[ARGV[2],idx[2]] | "sort -n -k1" ;      } } }' a.txt b.txt
  100     wang    man   90  80 200 wangsan woman 80    70 300 wangming man   60     50 400 wangzheng man   70    20
코드 설명:
2 차원 배열, aData [파일 이름, 관련 열 대응 값] 을 사용 합 니 다. 이 방법 은 여러 파일 내용 을 사용 할 수 있 습 니 다.2 차원 배열 을 통일 하 다.그리고 배열 을 순환 하여 if (i, j} in array) 를 통 해 해당 열 값 이 다른 파일 에 존재 하 는 지 찾 습 니 다.
 
이상 은 두 가지 실현 방법 입 니 다. 그 중에서 첫 번 째 사 고 는 비교적 간단 하고 이해 하기 쉽 습 니 다. 두 번 째 처 리 는 비교적 복잡 합 니 다. 더 좋 은 방법 이 있 으 면 여러분 이 저 에 게 공유 해 주 십시오.

좋은 웹페이지 즐겨찾기