bash 다른 파일을 기반으로 한 파일에 여러 빈 줄을 삽입하는 방법

bash 다른 파일을 기반으로 한 파일에 여러 빈 줄을 삽입하는 방법

bash를 사용하여 인덱스 파일(file2라고 함)을 기반으로 파일(file1이라고 함)에 여러 개의 빈 줄을 삽입하는 데 약간의 어려움이 있습니다. (이러한 파일은 전달된 변수로 간주될 수 있습니다.) 인덱스 파일(file2)은 다음과 같습니다.

-
-
-
M
H
A
-
N
X
X
M
-
-
-
F
G
A
...

file1은 다음과 같습니다.

M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

출력은 다음과 같아야 합니다.

-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

file2가 '-'를 제거하면 내용과 순서는 항상 file1의 첫 번째 열과 동일합니다.

Python의 데이터프레임으로 처리해 보았지만 너무 느립니다. 그래서 bash를 사용하여 이 문제를 해결하는 방법을 알고 싶습니다. 감사해요!

답변1

색인 파일의 문자가 항상 올바른 순서의 올바른 문자이고(표시되는 문자를 무시할 수 있도록) 빈 줄에 실제로 대시가 포함되어 있고 완전히 비어 있지 않다고 가정하면 다음이 작동할 수 있습니다.

$ awk -v datafile=data.txt '$1 == "-" { print "-"; next} { getline < datafile; print }' < index.txt 
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0
...

인덱스 파일을 한 번에 한 줄씩 읽습니다. 첫 번째 필드가 이면 -이를 인쇄하고, 그렇지 않으면 다른 파일에서 한 줄을 읽고 인쇄합니다. (즉, 인덱스 파일에 완전히 빈 줄이 나타나면 데이터 파일의 다음 줄로 이동한다는 의미입니다.)

답변2

GNU sed를 사용하여 두 파일의 첫 글자 순서가 완전히 동일하다고 가정하고 다음 줄을 무시하고 -각 "문자" 줄에 대해 한 줄을 읽고 삽입합니다.file1file2

$ sed -e '/^[A-Z]/{R file1' -e 'd;}' file2
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

답변3

file2를 인덱스 파일로, file1을 데이터 파일로 사용하여POSIX sed, 인덱스 파일을 사용하여 먼저 sed 코드를 생성한 다음 이를 데이터 파일에 적용하여 원하는 최종 출력을 얻습니다.

sed '
  1{
    x;s:.*:H;s/.*/-/;x:;x
    i\
x;s/.*/-/;x
    :loop
      /^-/!d;g;n
    b loop
  }
  /^-/s/.*/G/;t
  c\
n
' file2 |sed -f - file1

산출:-

-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

답변4

for j in $(awk '/-/{print NR}' file2); do sed -i ''$j'i -' file1; done

산출

cat file1
-
-
-
M   x1 y1 z1 m1 n1
H   x2 y2 z2 m2 n2
A   x3 y3 z3 m3 n3
-
N   x4 y4 z4 m4 n4
X   x5 y5 z5 m5 n5
X   x6 y6 z6 m6 n6
M   x7 y7 z7 m7 n7
-
-
-
F   x8 y8 z8 m8 n8
G   x9 y9 z9 m9 n9
A   x0 y0 z0 m0 n0

관련 정보