파일에서 특정 공간 복사

파일에서 특정 공간 복사

다음과 같은 파일이 있습니다

   18DMA      H 9996   0.886   5.687   5.320
   18DMA      H 9997   1.019   5.764   5.247
   18DMA     Np 9998   0.947   5.584   5.151
   18DMA      H 9999   1.033   5.541   5.113
   18DMA     Cn10000   0.880   5.674   5.050
   18DMA      H10001   0.831   5.616   4.971
   18DMA      H10002   0.814   5.751   5.091
   18DMA      H10003   0.957   5.735   5.003
   18DMA     Cn10004   0.837   5.486   5.185

원하는 출력은 3번째 열을 삭제하는 것이지만 특정 행/행부터 시작하여 뒤에 오는 원자의 이름과 번호 사이에 공백이 없으므로 열별로 삭제할 수 없습니다. 특정 개수의 문자를 선택하여 삭제하는 방법이 있나요? 예상되는 출력은 다음과 같아야 합니다.

   18DMA      H    0.886   5.687   5.320
   18DMA      H    1.019   5.764   5.247
   18DMA     Np    0.947   5.584   5.151
   18DMA      H    1.033   5.541   5.113
   18DMA     Cn    0.880   5.674   5.050
   18DMA      H    0.831   5.616   4.971
   18DMA      H    0.814   5.751   5.091
   18DMA      H    0.957   5.735   5.003
   18DMA     Cn    0.837   5.486   5.185

답변1

cut문자 모드에서 사용:

cut -c1-15,21-

정확한 문자 수를 조정해야 할 수도 있습니다. 다시 말하지만, 이는 입력이 탭( \t문자)을 구분 기호로 사용하지 않는다고 가정합니다(아마도 그렇지 않을 것입니다. 그러면 처음에 필드를 연결하는 데 문제가 없을 것입니다).

탭 문자가 있는 경우 expand프로그램은 이를 공백으로 변환할 수 있습니다.

답변2

s는 없지만 <TAB>필드 구분 기호로 공백이 여러 개 있다고 가정하고 내가 알아낸 샘플 데이터를 보고 계산합니다.

  $ sed -E 's/^(.{15}).{5}/\1/' file
   18DMA      H   0.886   5.687   5.320
   18DMA      H   1.019   5.764   5.247
   18DMA     Np   0.947   5.584   5.151
   18DMA      H   1.033   5.541   5.113
   18DMA     Cn   0.880   5.674   5.050
   18DMA      H   0.831   5.616   4.971
   18DMA      H   0.814   5.751   5.091
   18DMA      H   0.957   5.735   5.003
   18DMA     Cn   0.837   5.486   5.185

\1 대체 명령 의 교체 부분에서 이를 사용하여 복원할 수 있도록 처음 15자에 대해 "역참조"를 사용합니다 s.

답변3

$ awk -v OFS='\t' 'NF == 5 { sub("[0-9]*$", "", $2) } NF == 6 { $0 = $1 OFS $2 OFS $4 OFS $5 OFS $6 } { print }' file
18DMA   H       0.886   5.687   5.320
18DMA   H       1.019   5.764   5.247
18DMA   Np      0.947   5.584   5.151
18DMA   H       1.033   5.541   5.113
18DMA   Cn      0.880   5.674   5.050
18DMA   H       0.831   5.616   4.971
18DMA   H       0.814   5.751   5.091
18DMA   H       0.957   5.735   5.003
18DMA   Cn      0.837   5.486   5.185

이 짧은 awk프로그램은 입력 라인에 공백으로 구분된 필드가 5개 또는 6개 포함되어 있는지 여부에 따라 다른 작업을 수행합니다.

5개의 필드가 포함된 경우 두 번째 필드 끝에 있는 숫자를 모두 제거하고 나머지는 그대로 둡니다. 6개 필드가 포함된 경우 행은 다시 작성되지만 세 번째 필드는 생략됩니다.

출력은 탭으로 구분됩니다(또는 OFS명령줄에서 설정한 대로).

답변4

저라면 먼저 원본 콘텐츠를 "수정"한 다음 해당 열을 삭제하겠습니다. 그러나 두 가지를 동시에 수행할 수 있습니다.

awk '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; print}' input_file

18DMA H  0.886 5.687 5.320
18DMA H  1.019 5.764 5.247
18DMA Np  0.947 5.584 5.151
18DMA H  1.033 5.541 5.113
18DMA Cn  0.880 5.674 5.050
18DMA H  0.831 5.616 4.971
18DMA H  0.814 5.751 5.091
18DMA H  0.957 5.735 5.003
18DMA Cn  0.837 5.486 5.185

$0=$0할당으로 인해 awk현재 행이 다시 계산되고 다시 분할됩니다. 다른 모든 답변과 달리 이는 필드의 길이나 수가 아닌 두 번째 필드의 가능한 형식만 가정합니다.

탭을 출력 필드 구분 기호로 사용하는 버전:

awk -vOFS='\t' '{sub(/[0-9]+/," &",$2); $0=$0; $3=""; sub(OFS OFS,OFS); print}' input_file

18DMA   H       0.886   5.687   5.320
18DMA   H       1.019   5.764   5.247
18DMA   Np      0.947   5.584   5.151
18DMA   H       1.033   5.541   5.113
18DMA   Cn      0.880   5.674   5.050
18DMA   H       0.831   5.616   4.971
18DMA   H       0.814   5.751   5.091
18DMA   H       0.957   5.735   5.003
18DMA   Cn      0.837   5.486   5.185

추가 콘텐츠는 sub(OFS OFS, OFS)에서 생성한 빈 필드를 축소합니다 $3="". 이는 탭으로 구분된 필드를 특별히 요구하는 도구로 파일을 처리하거나 미적인 이유로 파일을 처리하는 경우에만 필요합니다.

관련 정보