특정 간격으로 동일한 텍스트 파일에 다른 텍스트를 추가/삽입하시겠습니까?

특정 간격으로 동일한 텍스트 파일에 다른 텍스트를 추가/삽입하시겠습니까?

특정 간격에 단일 텍스트를 삽입하는 방법을 알고 있습니다. 하지만 이제 내 문제는 한 파일에 저장된 다른 텍스트/단어를 특정 간격으로 다른 파일에 삽입하고 싶다는 것입니다 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.txtdata.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

관련 정보