열 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-VTAB

$ 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명령은 각 줄 앞에 줄 번호와 탭을 추가하여 주소가 지정된 줄을 인쇄합니다. 이는 탭으로 구분된 형식에 적합합니다.

관련 정보