아래에는 헤더가 동일하고 벡터가 다른 파일이 여러 개 있습니다. 모두 연결해야 하지만 첫 번째 파일의 헤더만 연결하고 다른 헤더는 모두 동일하므로 연결하고 싶지 않습니다.
예: 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
위의 "" 와 유사한 또 다른 솔루션은 head
GNU tail
또는 호환을 사용합니다.
첫 번째 파일의 헤더를 출력에 씁니다.
head -n 2 file1.txt > all.txt
head -n 2
-- 파일의 처음 2줄을 가져옵니다 .모든 파일의 내용을 추가합니다.
tail -n +3 -q file*.txt >> all.txt
-- 세 번째 줄부터 끝까지 인쇄합니다 . GNU는 여러 파일 이름을 인수(표준의 공통 확장자)로 사용할 수 있으며
-n +3
( 또한 GNU 확장자, FreeBSD 및 NetBSD에서도 지원됨) 헤더를 인쇄하지 않도록 지시합니다. 파일 이름( read ) 을 사용하여 파일을 덮어쓰는 대신 파일에 추가합니다 .tail
tail
-q
man
>>
>
물론 다음 두 명령을 한 줄에 입력할 수도 있습니다.
head -n 2 file1.txt > all.txt; tail -n +3 -q file*.txt >> all.txt
또는 그들 사이에 성공 확인을 ;
넣는 대신 .&&
Shell glob 확장은 기본적으로 어휘순으로 정렬됩니다. 즉, file1.txt
to는 file9.txt
숫자순으로 정렬되지만 로케일에 따라 및 사이 (또는 로케일에 따라 그 이전에도 )로 정렬 file10.txt
됩니다 . 사용하는 경우 숫자 정렬 에 사용됩니다 .file1.txt
file2.txt
file1.txt
zsh
file*.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
노트
:
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.