UNIX: 확장자가 다른 파일을 하나의 파일로 병합

UNIX: 확장자가 다른 파일을 하나의 파일로 병합

예: 내 /temp 디렉토리에는 100개의 파일이 있습니다. 50개는 확장자가 .msg이고 50개는 .xml입니다.

/temp/test1.xml
/temp/test2.xml
/temp/test3.xml
.........
/temp/test49.xml
/temp/test50.xml

그리고

/temp/test1.msg
/temp/test2.msg
/temp/test3.msg
.........
/temp/test49.msg
/temp/test50.msg

텍스트 파일에서 .xml과 .msg 파일의 내용을 조합하여 출력하고 싶습니다. 예를 들어 출력 파일은 다음과 같아야 합니다.

content of test1.xml
content of test1.msg
content of test2.xml
content of test2.msg
content of test3.xml
content of test3.msg
............
content of test49.xml
content of test49.msg
content of test50.xml
content of test50.msg

이 /temp 디렉토리에는 항상 동일한 수의 .msg 및 .xml 파일이 있습니다. 또한 출력 파일의 내용 앞에 경로나 파일 이름을 표시할 수 있습니까? 예를 들어:

text1.xml: content of test1.xml 
text1.msg: content of test1.msg
text2.xml: content of test2.xml
text2.msg: content of test2.msg
text3.xml: content of test3.xml
text3.msg: content of test3.msg
....................
text49.xml: content of test49.xml
text49.msg: content of test49.msg
text50.xml: content of test50.xml
text50.msg: content of test50.msg

나는 간단한 파이프를 파일로 사용해 보았습니다.

cat * > text.txt

그러나 이것은 필요한 결과를 제공하지 않습니다. 출력 파일에서는 먼저 모든 *.xml 파일의 내용을 나열한 다음 *.msg 파일을 나열합니다.

도와주세요.

답변1

for f in *xml ; do
  cat "$f" "${f/.xml/.msg}"
done > OUTPUTFILE

쉘을 사용하는 경우 도움이 될 수 있습니다 bash. 그렇지 않으면(다른 POSIX 쉘) cat "$f" "${f%.xml}.msg"cat행 대신에 다음을 사용하십시오.

답변2

이런 종류의 상황에서는 다음과 같이 진행하는 것이 합리적입니다.

  1. 모든 파일을 텍스트 파일로 나열합니다.

    $ ls > files
    
  2. 텍스트 파일을 편집하여 원하지 않는 파일을 제거하고 나머지 파일을 원하는 정확한 순서로 정렬합니다.

  3. 그런 다음 다음을 수행하십시오(파일 이름에 공백이나 재미있는 문자가 없다고 가정).

    $ cat $(cat files) > bigfile
    

이 접근 방식의 변형은 텍스트 파일을 하나의 큰 명령으로 변경하는 것입니다.

file1
file2
file with spaces 3
...
filen

에게:

cat \
file1 \
file2 \
"file with spaces 3" \
... \
filen \
> bigfile

그런 다음 파일을 스크립트로 소스로 지정하십시오.

$ . ./files

vi를 사용 하면 버퍼의 모든 줄에 공백과 백슬래시를 추가할 수 있습니다 :%s/$/ \\/.

답변3

for i in {1..50}; do
    echo "text$i.xml: `cat text$i.xml`" >> output.txt
    echo "text$i.msg: `cat text$i.msg`" >> output.txt
done

답변4

정상적인 순서라면 다음과 같이 할 수 있습니다.

배쉬에서:

for ITER in {1..50}
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

또는 유틸리티가 있는 경우seq

for ITER in $(seq 1 50)
do
    cat test${ITER}.xml
    cat test${ITER}.msg
done > test.txt

관련 정보