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
첫 번째 표현식은 O
1행에서 시작하고 세 번째 행마다 탭 문자를 추가합니다. 두 번째 표현식은 H
세 번째 줄마다가 아니라 1번 줄에서 시작하는 모든 줄에 탭 문자를 추가합니다.
sed
다음 두 가지 비표준 기능으로 인해 GNU가 필요합니다.
- 주소는
n~m
"모든m
: 라인, 라인에서 시작n
"을 의미합니다. - 문자 시퀀스는
\t
리터럴 탭 문자로 확장됩니다.
다른 도구를 사용하십시오:
yes 'O H H' | tr ' ' '\n' | head -n "$( wc -l <file )" | paste - file
이는 및 를 사용하여 별도의 줄에 O
, H
, (반복) 의 꾸준한 스트림을 생성합니다. 스트림은 파일의 줄 수와 일치하도록 단축됩니다(이는 . 그런 다음 탭을 구분 기호로 사용하여 파일의 나머지 부분 왼쪽에 삽입된 :s 및 :s를 사용합니다.H
yes
tr
head
wc -l
O
H
paste
답변3
다음을 수행할 수 있습니다.
awk 'BEGIN {chars="OHH"; next_char=1} {print substr(chars, next_char, 1), $0; next_char++} next_char==4 {next_char=1}' matrix