노트

노트

아래에는 헤더가 동일하고 벡터가 다른 파일이 여러 개 있습니다. 모두 연결해야 하지만 첫 번째 파일의 헤더만 연결하고 다른 헤더는 모두 동일하므로 연결하고 싶지 않습니다.

예: file1.txt

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B 
C

파일 2.txt

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
D
E 
F

출력이 필요합니다.

<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B
C
D
E 
F

R로 스크립트를 작성할 수 있지만 이를 쉘에서 사용해야 합니까?

답변1

cat+grep위의 "" 와 유사한 또 다른 솔루션은 headGNU tail또는 호환을 사용합니다.

  1. 첫 번째 파일의 헤더를 출력에 씁니다.

    head -n 2 file1.txt > all.txt
    

    head -n 2-- 파일의 처음 2줄을 가져옵니다 .

  2. 모든 파일의 내용을 추가합니다.

    tail -n +3 -q file*.txt >> all.txt
    

    -- 세 번째 줄부터 끝까지 인쇄합니다 . GNU는 여러 파일 이름을 인수(표준의 공통 확장자)로 사용할 수 있으며 -n +3( 또한 GNU 확장자, FreeBSD 및 NetBSD에서도 지원됨) 헤더를 인쇄하지 않도록 지시합니다. 파일 이름( read ) 을 사용하여 파일을 덮어쓰는 대신 파일에 추가합니다 .tailtail-qman>>>

물론 다음 두 명령을 한 줄에 입력할 수도 있습니다.

head -n 2 file1.txt > all.txt; tail -n +3 -q file*.txt >> all.txt

또는 그들 사이에 성공 확인을 ;넣는 대신 .&&

Shell glob 확장은 기본적으로 어휘순으로 정렬됩니다. 즉, file1.txtto는 file9.txt숫자순으로 정렬되지만 로케일에 따라 및 사이 (또는 로케일에 따라 그 이전에도 )로 정렬 file10.txt됩니다 . 사용하는 경우 숫자 정렬 에 사용됩니다 .file1.txtfile2.txtfile1.txtzshfile*.txt(n)

답변2

R에서 수행하는 방법을 알고 있다면 반드시 R에서 수행하십시오. 클래식 유닉스 도구의 경우 이는 awk에서 가장 자연스럽게 수행됩니다.

awk '
    FNR==1 && NR!=1 { while (/^<header>/) getline; }
    1 {print}
' file*.txt >all.txt

awk 스크립트의 첫 번째 줄은 FNR==1모든 파일의 첫 번째 줄( )이 아닌 한 파일의 첫 번째 줄( NR==1)과 일치합니다. 이러한 조건이 충족되면 표현식이 실행되어 while (/^<header>/) getline;awk가 현재 행이 regexp와 일치하는 한 다른 행을 계속 읽습니다(현재 행 건너뛰기) ^<header>. awk 스크립트의 두 번째 줄은 이전에 건너뛴 줄을 제외한 모든 항목을 인쇄합니다.

답변3

이 시도:

$ cat file1.txt; grep -v "^<header" file2.txt
<header>INFO=<ID=DP,Number=1,Type=Integer>
<header>INFO=<ID=DP4,Number=4,Type=Integer>
A
B 
C
D
E 
F

노트

  • -v플래그는 일치를 반전한다는 의미입니다.
  • ^존재하다정규식, 방법문자열의 시작
  • 파일이 많으면 이렇게 할 수 있습니다

:

array=( files*.txt )
{ cat ${array[@]:0:1}; grep -v "^<header" ${array[@]:1}; } > new_file.txt

그것은어레이 슬라이싱 기술.

답변4

array=( *.txt );head -1 ${array[0]} > all.txt; tail -n +2 -q ${array[@]:0} >> all.txt

헤더가 동일하고 결합/연결이 필요한 .txt 파일이 있는 폴더를 사용한다고 가정하면 이 코드는 txt 파일을 모두모두.txt헤더가 하나만 있습니다. 첫 번째 줄(세미콜론으로 구분된 줄)은 연결할 모든 텍스트 파일을 수집하고, 두 번째 줄은 첫 번째 txt 파일의 헤더를 출력합니다.모두.txt, 마지막 줄은 헤더 없이 수집된 모든 텍스트 파일을 연결하고(2번째 줄부터 연결하여)모두.txt.

관련 정보