열 작업에 AWK 사용

열 작업에 AWK 사용

200개 이상의 열이 포함된 파일이 있습니다. 예를 들어, 여기서는 열 수가 더 적은 파일(9)을 사용하고 있습니다. 아래는 입력 파일입니다(몇 줄).

chr10   181243  225933  1   1   1   10  0   36
chr10   181500  225933  1   1   1   106 0   35
chr10   226069  255828  1   1   1   57  0   37
chr10   243946  255828  1   1   1   4   0   27
chr10   255989  267134  1   1   1   87  0   32
chr10   255989  282777  1   1   1   61  0   34
chr10   267297  282777  1   1   1   61  0   37
chr10   282856  283524  1   1   1   92  0   35
chr10   282856  285377  1   1   1   1   0   15
chr10   283618  285377  1   1   1   72  0   33

마지막 열(여기서는 열 9)이 출력 파일의 열 4가 되도록 파일을 다시 정렬한 다음 다른 모든 항목을 인쇄하고 싶습니다. 그래서 내가 찾고있는 결과는 다음과 같습니다.

chr10   181243  225933  36  1   1   1   10  0
chr10   181500  225933  35  1   1   1   106 0
chr10   226069  255828  37  1   1   1   57  0
chr10   243946  255828  27  1   1   1   4   0
chr10   255989  267134  32  1   1   1   87  0
chr10   255989  282777  34  1   1   1   61  0
chr10   267297  282777  37  1   1   1   61  0
chr10   282856  283524  35  1   1   1   92  0
chr10   282856  285377  15  1   1   1   1   0
chr10   283618  285377  33  1   1   1   72  0

열 수가 적은 파일에서는 다음과 같은 방법을 사용하여 위의 출력을 얻을 수 있습니다.

awk -v OFS="\t" '{print $1,$2,$3,$9,$4,$5,$6,$7,$8}'

이제 열 수가 많은 파일이 있는 경우 파일의 마지막 열을 네 번째 열로 만들고 나머지는 그대로 인쇄하려면 어떻게 해야 합니까?

답변1

Perl은 이에 대해 매우 깔끔합니다. 각 줄을 단어로 나누고 마지막 단어를 팝하여 인덱스 3(0에서 시작)에 삽입합니다.

$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10  181243  225933  36  1  1  1  10   0
chr10  181500  225933  35  1  1  1  106  0
...

답변2

네 번째 필드를 마지막 필드로 바꾸려면:

awk -v OFS="\t" '{ $4 = $NF; $NF=""; print }

마지막 필드 삽입앞으로네 번째 필드에서는 약간의 창의력을 발휘해야 합니다.

awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'

그러면 마지막 필드가 유지되고 모든 필드를 반복하여 각 필드를 뒤로 네 번째 필드 앞으로 이동한 다음 원하는 네 번째 필드를 제자리에 배치합니다.

$ echo {1..10} | awk -v OFS="\t" '{temp=$NF; for( i=NF;i>4;i-- ) {$i=$(i-1)}; $4=temp  ; print}'
1   2   3   10  4   5   6   7   8   9

관련 정보