특정 간격에 단일 텍스트를 삽입하는 방법을 알고 있습니다. 하지만 이제 내 문제는 한 파일에 저장된 다른 텍스트/단어를 특정 간격으로 다른 파일에 삽입하고 싶다는 것입니다 add.txt
.data.txt
add.txt
첫 번째 단어를 특정 위치에 삽입하고 data.txt
두 번째 단어를 add.txt
다음 특정 위치에 삽입하고 싶습니다 .
내 열에 data.txt
는 두 개의 열이 있지만 삽입된 단어는 병합된 행으로 표시되어야 합니다. 아래 예를 참조하여 나에게 필요한 것이 무엇인지 확인하세요.
add.txt
2001-01-01 00:00:00 42 1
2001-01-02 00:00:00 42 1
2001-01-03 00:00:00 42 1
2001-01-04 00:00:00 42 1
2001-01-05 00:00:00 42 1
data.txt
-500 11.822788
-400 12.006394
-350 12.287062
-300 12.793395
-500 11.823597
-400 12.008012
-350 12.287062
-300 12.794204
-500 11.826023
-400 12.011247
-350 12.291915
-300 12.800675
-500 11.827641
-400 12.013674
-350 12.295959
-300 12.805528
-500 11.830067
-400 12.016100
-350 12.300003
-300 12.811998
제 생각에는
2001-01-01 00:00:00 42 1
-500 11.822788
-400 12.006394
-350 12.287062
-300 12.793395
2001-01-02 00:00:00 42 1
-500 11.823597
-400 12.008012
-350 12.287062
-300 12.794204
2001-01-03 00:00:00 42 1
-500 11.826023
-400 12.011247
-350 12.291915
-300 12.800675
2001-01-04 00:00:00 42 1
-500 11.827641
-400 12.013674
-350 12.295959
-300 12.805528
2001-01-04 00:00:00 42 1
-500 11.830067
-400 12.016100
-350 12.300003
-300 12.811998
awk
나는 또는 이와 유사한 것을 사용하는 가장 간단한 솔루션을 찾고 있습니다 sed
.
답변1
$ awk '(FNR-1)%4 == 0 { getline add <"add.txt"; print add }; 1' data.txt
2001-01-01 00:00:00 42 1
-500 11.822788
-400 12.006394
-350 12.287062
-300 12.793395
2001-01-02 00:00:00 42 1
-500 11.823597
-400 12.008012
-350 12.287062
-300 12.794204
2001-01-03 00:00:00 42 1
-500 11.826023
-400 12.011247
-350 12.291915
-300 12.800675
2001-01-04 00:00:00 42 1
-500 11.827641
-400 12.013674
-350 12.295959
-300 12.805528
2001-01-05 00:00:00 42 1
-500 11.830067
-400 12.016100
-350 12.300003
-300 12.811998
awk
이는 파일의 각 행을 읽고 출력하는 데 사용됩니다 data.txt
. 네 번째 줄을 출력하기 전에 파일에서 한 줄을 읽고 출력합니다 add.txt
.
읽은 데이터가 add.txt
올바르게 읽혔는지 확인하기 위한 검사는 수행되지 않습니다(파일이 너무 짧으면 위 코드는 마지막 줄을 반복합니다).
사용 paste
:
$ paste -d '\n' add.txt - - - - <data.txt
2001-01-01 00:00:00 42 1
-500 11.822788
-400 12.006394
-350 12.287062
-300 12.793395
2001-01-02 00:00:00 42 1
-500 11.823597
-400 12.008012
-350 12.287062
-300 12.794204
2001-01-03 00:00:00 42 1
-500 11.826023
-400 12.011247
-350 12.291915
-300 12.800675
2001-01-04 00:00:00 42 1
-500 11.827641
-400 12.013674
-350 12.295959
-300 12.805528
2001-01-05 00:00:00 42 1
-500 11.830067
-400 12.016100
-350 12.300003
-300 12.811998
여기서는 첫 번째 필드의 한 줄과 다음 네 개의 필드 의 네 줄을 paste
사용하여 레코드를 생성하도록 요청합니다 . 필드 구분 기호로 사용되는 문자를 개행 문자로 설정했습니다 .add.txt
data.txt
-d '\n'
답변2
GNU sed
특히 MacOS의 경우 이것이 옵션 이라면 다음 sed 코드를 실행할 수 있습니다. GNU에서 추가한 R 명령과 ~ 명령이 여기서 핵심입니다.
~는 sed가 네 번째 줄마다 구체적으로 보이도록 만들고, 다른 줄의 경우 표준 출력으로 전달됩니다. R은 add.txt에서 행을 가져와 data.txt 행과 혼합해야 합니다.
$ sed '
1~4!b
R add.txt
$!N
' data.txt
답변3
IMHO, 가장 쉬운 방법은 add.txt를 배열로 읽은 다음 배열에서 data.txt의 4줄마다 인쇄하는 것입니다.
$ awk 'NR==FNR{a[NR]=$0; next} FNR%4==1{print a[++c]} 1' add.txt data.txt
2001-01-01 00:00:00 42 1
-500 11.822788
-400 12.006394
-350 12.287062
-300 12.793395
2001-01-02 00:00:00 42 1
-500 11.823597
-400 12.008012
-350 12.287062
-300 12.794204
2001-01-03 00:00:00 42 1
-500 11.826023
-400 12.011247
-350 12.291915
-300 12.800675
2001-01-04 00:00:00 42 1
-500 11.827641
-400 12.013674
-350 12.295959
-300 12.805528
2001-01-05 00:00:00 42 1
-500 11.830067
-400 12.016100
-350 12.300003
-300 12.811998