모든 텍스트 파일을 하나의 파일로 병합하려고 합니다. 모든 텍스트 파일에는 하나의 열과 동일한 수의 행이 있습니다. 내 데이터 파일 이름은 data_1.txt, data_2.txt, data_3.txt, . . data_n.txt. 여기서 n은 병합할 텍스트 파일의 수입니다. 1부터 n까지 순서대로 병합하고 싶습니다. 다음 코드를 시도했지만 원하는 방식으로 작동하지 않습니다. 열 순서를 유지하지 않습니다.
내 샘플 데이터는 다음과 같습니다
data_1.txt
0.020085
0.0017361
0.77963
0.98659
0.33102
0.099835
0
0
0.073004
0.29978
data_2.txt
0.021407
0.0017191
0.82385
1.0449
0.34593
0.10535
0
0
0.078362
0.31509
data_3.txt
0.022706
0.0016876
0.85447
1.0922
0.35556
0.11063
0
0
0.083983
0.32536
원하는 출력
조합.txt
0.020085 0.021407 0.022706
0.0017361 0.0017191 0.0016876
0.77963 0.82385 0.85447
0.98659 1.0449 1.0922
0.33102 0.34593 0.35556
0.099835 0.10535 0.11063
0 0 0
0 0 0
0.073004 0.078362 0.083983
0.29978 0.31509 0.32536
내 문제를 해결하도록 도와주실 수 있나요?
#!/bin/bash
paste data_*.txt > combined.txt
답변1
를 사용하면 zsh
glob 한정자를 사용하여 파일 이름이 생성되는 순서에 영향을 줄 수 있습니다.
paste file_*.txt(n)
열 예정이다숫자넣어서 정렬file_10.txt
뒤쪽에 file_9.txt
파일이 CR 문자(Microsoft 세계에서 가져온 것처럼)로 끝나는 경우 해당 문자는 터미널로 출력할 때 커서를 첫 번째 열로 이동합니다.
따라서 포함된 파일의 경우 A\rB\rC\rn
(MS-DOS 형식의 파일이 3개 있는 경우 발생 paste
) 위의 내용을 파이핑하여 CR 문자를 제거할 수 있습니다 cat that-file
.C
tr -d '\r'
답변2
당신은 그것을 사용할 수 있습니다버팀대 확장힘 paste
정렬:
$ paste data_{1..3}.txt
0.020085 0.021407 0.022706
0.0017361 0.0017191 0.0016876
중괄호는 여러 단어로 확장되며 각 단어에는 중괄호 왼쪽과 오른쪽 부분이 있습니다. 구문 은 다음 n..m
과 같습니다서열 표현:
시퀀스 표현식은 {x..y[..incr]} 형식을 취합니다. 여기서 x와 y는 정수 또는 단일 문자이고 incr(선택적 증분)은 정수입니다. 정수가 제공되면 표현식은 x와 y 사이의 모든 숫자(포함)로 확장됩니다.
위의 명령줄은 다음과 같이 확장됩니다.
paste data_1.txt data_2.txt data_3.txt
여기에는 올바른 순서의 파일이 포함됩니다. 3
이를 원하는 수의 파일로 변경하여 적절한 파일 이름을 모두 얻을 수 있습니다.
이 paste
명령은 파일 매개변수를 인수로 제공된 순서대로 열 단위로 연결하므로 인수의 순서가 중요합니다. filenames 를 사용하면 *
파일 이름이 알파벳순으로 확장됩니다. 이는 10개 이상의 파일이 있는 경우 잘못된 것이므로 열의 순서가 잘못됩니다. 1~9개 파일의 경우 어느 쪽이든 괜찮습니다.
답변3
paste -d " " 1.txt 2.txt > 4.txt
그것을 사용하는 또 다른 방법이 있습니다 awk
:
$ awk '{printf "%s",$1; getline < "1.txt" ; printf " %s\n",$1}' 2.txt