텍스트 파일의 열 i를 증가하는 숫자로 교체

텍스트 파일의 열 i를 증가하는 숫자로 교체

이것과 매우 유사한 작업을 수행해야 합니다.문자열을 순차 인덱스로 교체, 그러나 열에 숫자를 추가하는 대신 전체 열을 증가하는 숫자로 바꿉니다. 이와 같이:

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
0   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
0   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

~이 되다

0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

(0으로 시작하든 1로 시작하든 상관없습니다.)

바보 같은 느낌이 들지만 이 문제에 대한 해결책을 내 상황에 적용할 수는 없습니다...

답변1

행에 번호를 매기려면 다음을 사용할 수 있습니다 nl. 열을 제거하거나 유지하려는 열을 필터링하려면 다음을 사용할 수 있습니다 cut.

$ cut -f 2- cols.txt | nl
     1  0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
     2  0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
     3  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     4  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
     5  0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

유일한 짜증나는 점 nl은 줄 시작 부분에 공백 패딩을 삽입한다는 것입니다(기본적으로 줄 번호 필드의 너비는 6자이며 줄 번호가 잘리므로 이 너비를 낮추고 싶지는 않습니다). 다음과 같이 이러한 문제를 제거할 수 있습니다.

$ cut -f 2- cols.txt | nl | sed 's/^ *//'
1       0       chr1    3000575 3000801 0       chr1    4340023 4340249 32      32
2       0       chr1    3000641 3000801 -1      chr1    3311943 3311783 32      32
3       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
4       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32
5       0       chr1    3000674 3000801 -1      chr1    3001534 3001407 32      32

cut유틸리티는 입력에서 "제거"하려는 열 목록을 가져옵니다. 우리의 경우에는 2열 이후( )입니다 -f 2-. 데이터가 탭으로 구분되어 있으므로 cut이를 수정하기 위해 수정할 필요가 없습니다. 그렇지 않으면 다른 구분 기호를 사용하도록 지시할 수 있습니다 -d.

sed명령은 단순히 줄 시작 부분의 공백을 대체합니다 nl.

답변2

그리고awk

$ awk '{$1=FNR-1; print}' OFS='\t' file
0   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32
1   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32
2   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

답변3

With( 대체 시 ed리터럴 탭 문자 사용 , Ctrl-V+로 구성)TAB

$ ed -s file << EOF
,s/0    //
,n
q
EOF

1   0   chr1    3000575 3000801 0   chr1    4340023 4340249 32  32  
2   0   chr1    3000641 3000801 -1  chr1    3311943 3311783 32  32  
3   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
4   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32  
5   0   chr1    3000674 3000801 -1  chr1    3001534 3001407 32  32

(.,.)n명령은 각 줄 앞에 줄 번호와 탭 문자를 추가하여 지정된 줄을 인쇄합니다. 이는 탭으로 구분된 형식에 이상적입니다.

관련 정보