awk를 사용하여 세 개의 열 파일에 한 개의 열을 추가합니다.

awk를 사용하여 세 개의 열 파일에 한 개의 열을 추가합니다.

awk를 사용하여 file.txt의 기존 행렬에 새 열을 추가하고 싶습니다. 파일이 있습니다

  -1.664405      -0.019498       0.487501
  -2.210156       0.326547       1.193717
  -2.260318      -0.104277      -0.256821
   2.189078      -2.103898       1.321050
   1.558565      -1.476110       0.967988
   1.764428      -2.955372       1.216211
   ...
   ...

나는 이런 것을 원한다

O     -1.664405      -0.019498       0.487501
H     -2.210156       0.326547       1.193717
H     -2.260318      -0.104277      -0.256821
O      2.189078      -2.103898       1.321050
H      1.558565      -1.476110       0.967988
H      1.764428      -2.955372       1.216211
    ...
    ...

O와 H는 이런 형태로 수백 번 체계적으로 변화해야 합니다.

awk로 이 작업을 수행하는 방법을 아는 사람이 있나요? 미리 감사드립니다

답변1

얼마나 많은 들여쓰기를 원하는지 명확하지 않으므로 새로운 첫 번째 열과 후속 열 사이에 공백이 하나만 있다고 가정합니다.

꼭 필요한 경우 awk다음과 같이 할 수 있습니다.

awk '(NR-1)%3{print "H", $0; next}{print "O", $0}'

sed다른 방법도 사용할 수 있습니다.

sed '1~3{s/^/O /p;d};s/^/H /'

답변2

awk '{ print (FNR-1) % 3 ? "H" : "O", $0 }' file

이는 현재 줄의 줄 번호가 3의 배수인지 여부에 따라 awk현재 줄 앞에 an H또는 an 을 붙이는 데 사용됩니다 .O

새 열과 다른 열 사이의 구분 기호로 탭 문자를 사용하려면 해당 OFS값이 다음과 같은지 확인하세요 \t.

awk -v OFS='\t' '{ print (FNR-1) % 3 ? "H" : "O", $0 }' file

구체적으로 GNU를 사용 sed하고 탭을 사용하여 새 열을 다른 열과 분리한다고 가정합니다.

sed -e '1~3 s/^/O\t/' -e '1~3! s/^/H\t/' file

첫 번째 표현식은 O1행에서 시작하고 세 번째 행마다 탭 문자를 추가합니다. 두 번째 표현식은 H세 번째 줄마다가 아니라 1번 줄에서 시작하는 모든 줄에 탭 문자를 추가합니다.

sed다음 두 가지 비표준 기능으로 인해 GNU가 필요합니다.

  1. 주소는 n~m"모든 m: 라인, 라인에서 시작 n"을 의미합니다.
  2. 문자 시퀀스는 \t리터럴 탭 문자로 확장됩니다.

다른 도구를 사용하십시오:

yes 'O H H' | tr ' ' '\n' | head -n "$( wc -l <file )" | paste - file

이는 및 를 사용하여 별도의 줄에 O, H, (반복) 의 꾸준한 스트림을 생성합니다. 스트림은 파일의 줄 수와 일치하도록 단축됩니다(이는 . 그런 다음 탭을 구분 기호로 사용하여 파일의 나머지 부분 왼쪽에 삽입된 :s 및 :s를 사용합니다.Hyestrheadwc -lOHpaste

답변3

다음을 수행할 수 있습니다.

awk 'BEGIN {chars="OHH"; next_char=1} {print substr(chars, next_char, 1), $0; next_char++} next_char==4 {next_char=1}' matrix

관련 정보