행렬을 단일 행 데이터로 변경

행렬을 단일 행 데이터로 변경

.txt 파일에 여러 개의 행렬이 있고 각 행렬이 한 행에 있어야 합니다. 예를 들어
matrices.txt는 다음과 같습니다.

1 2 3 4
2 3 4 5
3 4 5 6

3 4 5 6
2 3 2 5
2 3 4 5
2 3 5 6
2 3 4 5
...

내가 원하는 것은 modified_matrices.txt:

1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5
...

파일에는 약 1000개의 행렬이 있으며 모두 정수가 아닙니다(0.8888888889888).

답변1

가능한 awk해결책은 다음과 같습니다.

awk 'BEGIN { RS = ""; } { $1 = $1; } 1' matrices.txt > modified_matrices.txt

답변2

Vi/Vim에서는 간단히 다음을 실행할 수 있습니다:

:%j

모든 전선을 함께 연결하거나:

:%v/^$/-1j

줄 바꿈으로 구분된 모든 행렬을 연결합니다(Vim의 특정 텍스트 패턴 사이에 선 연결하기).

명령줄에서 이 작업을 수행해야 하는 경우 다음을 시도해 보세요.

ex -s +%j +"wq modified_matrices.txt" matrices.txt

모든 행을 연결하거나 다음을 수행합니다.

ex -s +'%v/^$/-1j' +'wq! modified_matrices.txt' matrices.txt

줄 바꿈으로 구분된 모든 행렬을 연결합니다.

답변3

이를 수행하려면 작은 bash 스크립트를 사용할 수 있습니다.

$ cat data
1 2 3 4
2 3 4 5
3 4 5 6

3 4 5 6
2 3 2 5
2 3 4 5
2 3 5 6
2 3 4 5

$ cat foo.sh
#!/bin/bash

while read line; do
    if [[ "${line}" = "" ]]; then
        echo ""
    else
        echo -n "${line} "
    fi
done
echo ""

$ bash foo.sh < data
1 2 3 4 2 3 4 5 3 4 5 6
3 4 5 6 2 3 2 5 2 3 4 5 2 3 5 6 2 3 4 5

답변4

sed오직:

sed '/^$/!{H;$!d;};x;s/.//;y/\n/ /' infile > outfile

이는 예약된 공간에 비어 있지 않은 줄을 축적하여 마지막 줄이 아닌 경우 제거합니다. 그렇지 않으면 버퍼를 교체하고 선행 줄 바꿈을 제거하고 모든 줄 바꿈을 공백으로 변환합니다.
여러 개의 빈 줄로 블록을 분리하고 하나로 축소합니다.

sed '/^$/!{         # if line isn't empty
H                   # append to hold space
$!d                 # if it's not the last line, delete it
b end               # branch to label end (this happens only if on the last line)
}
//b end             # if line is empty, branch to label end
: end               # label end
x                   # exchange pattern space w. hold space
//d                 # if pattern space is an empty line, delete it; else
s/\n//              # remove the leading \newline
s/\n/ /g            # replace all remaining \newline chars with spaces
' infile > outfile

또는 문장으로:

sed '/^$/!{H;$!d;$b end;};//b end;: end;x;//d;s/\n//;s/\n/ /g' infile > outfile

관련 정보