여러 파일에서 텍스트 줄을 추출하여 하나의 파일로 인쇄

여러 파일에서 텍스트 줄을 추출하여 하나의 파일로 인쇄

저는 여러 파일의 특정 데이터 줄을 새 텍스트 파일로 조합해야 하는 프로젝트를 진행하고 있습니다. 예를 들어, 각각 값의 행렬을 포함하는 3개의 파일이 있다고 가정해 보겠습니다.

텍스트 파일 1

Obs.    TGCP_WM23   STT_WM189   MPO_WM496   PTP_WM724
TGCP_WM23   0.000000    0.174510    0.153292    0.177030
STT_WM189   0.174510    0.000000    0.077663    0.203359
MPO_WM496   0.153292    0.077663    0.000000    0.183706
PTP_WM724   0.177030    0.203359    0.183706    0.000000

텍스트 파일 2

Obs.    TGCP_WM15   STT_WM187   MPO_WM485   PTP_WM725
TGCP_WM15   0.000000    0.157164    0.145516    0.168991
STT_WM187   0.157164    0.000000    0.051973    0.187443
MPO_WM485   0.145516    0.051973    0.000000    0.171824
PTP_WM725   0.168991    0.187443    0.171824    0.000000

텍스트 파일 3

Obs.    TGCP_WM1    STT_WM184   MPO_WM489   PTP_WM721
TGCP_WM1    0.000000    0.166831    0.161654    0.192732
STT_WM184   0.166831    0.000000    0.059373    0.202718
MPO_WM489   0.161654    0.059373    0.000000    0.185286
PTP_WM721   0.192732    0.202718    0.185286    0.000000

이 3개 파일을 자동으로 읽고 각 파일의 두 번째 줄을 새 텍스트 파일의 연속 줄로 인쇄하여 새 텍스트 파일에 다음이 포함되도록 하고 싶습니다.

새 텍스트 파일 만들기

TGCP_WM23   0.000000    0.174510    0.153292    0.177030
TGCP_WM15   0.000000    0.157164    0.145516    0.168991
TGCP_WM1    0.000000    0.166831    0.161654    0.192732

Mac에서 터미널을 사용하여 유사한 작업을 비교적 쉽게 수행할 수 있는 방법이 있습니까? 현재 저는 일부 다운스트림 분석을 실행할 수 있도록 데이터를 추출하고 형식을 지정해야 하는 2,200개의 파일을 보고 있습니다. 이 모든 파일을 수동으로 열거나 텍스트를 복사하여 값의 형식이 더 유용한 새 파일에 붙여넣는 것을 피하고 싶습니다.

편집: 제가 작업 중인 모든 파일은 Genodive라는 프로그램에서 출력된 텍스트 파일입니다. 파일 중 절반은 위에 표시된 예와 유사한 Fst 매트릭스 파일입니다. 나머지 1,100개 파일은 내용이 다음과 같은 유전적 다양성 출력 파일입니다.


___________________________________________________________________

GenoDive 3.01, 2019-12-12 23:28:01 +0000
Genetic Diversity: Nei 1987.
File: TrkNbr_1083n1282_L1n2_PrelimPops_02SubSampPops_Rep001.txt
8 of 8 individuals included, 6843 of 6843 loci included

– Summary of indices of genetic diversity

Statistic   Value   Std.Dev.    c.i.2.5%    c.i.97.5%   Description
Num 1.418   0.006   1.405   1.428   Number of alleles
Eff_num 1.086   0.002   1.082   1.088   Effective number of alleles
Ho  0.092   0.002   0.089   0.096   Observed Heterozygosity
Hs  0.098   0.002   0.094   0.101   Heterozygosity Within Populations
Ht  0.114   0.002   0.110   0.117   Total Heterozygosity
H't 0.122   0.002   0.117   0.125   Corrected total Heterozygosity
Gis 0.055   0.013   0.030   0.079   Inbreeding coefficient

Standard deviations of F-statistics were obtained through jackknifing over loci.
95% confidence intervals of F-statistics were obtained through bootstrapping over loci.


– Indices of genetic diversity per population

Population  Num Eff_num Ho  Hs  Gis
TGCP_WM3    1.261   1.183   0.142   0.141   -0.003
STT_WM186   1.186   1.132   0.088   0.108   0.183
MPO_WM483   1.194   1.136   0.097   0.109   0.110
PTP_WM732   1.095   1.068   0.056   0.051   -0.097


___________________________________________________________________

Fst 파일과 유전적 다양성 파일을 동시에 처리할 필요가 없고, 각 파일 유형에서 서로 다른 데이터를 추출하고 싶습니다.

두 파일 형식의 명명 규칙은 다음과 같습니다.

첫 번째 파일 이름은

TrkNbr_1083n1282_L1n2_PrelimPops_02SubSampPops_Rep001_FstRslts

유전적 다양성 파일의 이름은 다음과 같습니다.

TrkNbr_1083n1282_L1n2_PrelimPops_02SubSampPops_Rep001_GenDivRslts

파일명의 구별되는 부분은 "##SubSampPops_Rep###" 부분입니다. 1,100개의 "FstRslts" 파일이 있으며, 이 1,100개의 파일은 각각 100개의 파일로 구성된 11개의 그룹으로 세분화됩니다.

02SubSampPops_Rep001
02SubSampPops_Rep002
02SubSampPops_Rep003
.
.
.
02SubSampPops_Rep100
04SubSampPops_Rep001
04SubSampPops_Rep002
04SubSampPops_Rep003
.
.
.
04SubSampPops_Rep100

마찬가지로, 동일한 방식으로 구성된 "GenDivRslts" 파일이 1,100개 있습니다.

답변1

먼저 명령줄에서 몇 가지 유용한 쉘 변수를 정의합니다.

$ d='[0-9]'
$ pre='TrkNbr_1083n1282_L1n2_PrelimPops'
$ main="$d${d}SubSampPops_Rep$d$d$d"
$ post='GenDivRslts'
$ filename="${pre}_${main}_${post}"

GNU 사용 awk:

$ find . -type f -name "$filename"      |
  sort -t_ -nk5.1,5.2 -nk6.4,6.6        |
  xargs -r awk 'FNR==2{print;nextfile}' \
> new_text_file;

GNU 사용 sed:

$ find . -type f -name "$filename" |
  sort -t_ -nk5.1,5.2 -nk6.4,6.6   |
  xargs -r sed -se '2!d'           \
> new_text_file;

그리고 perl:

$ find . -type f -name "$filename"                |
  sort -t_ -nk5.1,5.2 -nk6.4,6.6                  |
  xargs -r perl -ne 'print,close ARGV if $. == 2' \
> new_text_file;

그리고 head/tail:

$ find . -type f -name "$filename" |
  sort -t_ -nk5.1,5.2 -nk6.4,6.6   |
  xargs -r \
   sh -c '
    for f
    do
     head -n 2 "$f" | tail -n 1
    done
   ' x > new_text_file;

답변2

왜 간단하지 않은가?

awk 'FNR == 2' *FstRslts > NewFile

? 명령줄이 너무 길어지면 입력 파일을 하위 구분별로 그룹화하거나 xargs줄 분할을 사용해 보세요.

답변3

zsh버전(Mac 터미널의 기본 셸):

for file in $(find . -type f -iname "*.txt"); cat "$file" | head -2 | tail -1 >> output.txt

이는 모든 입력 텍스트 파일이 동일한 디렉터리에 있고 파일이 처리되는 순서가 중요하지 않다고 가정합니다.

bash버전:

for file in $(find . -type f -iname "*.txt"); do cat $file | head -2 | tail -1; done >> output.txt 

편집 1:echo명령 대체에 대해 Nasir와 Steeldriver의 제안을 따를 필요는 없습니다. 다음은 awk 버전입니다.

for file in $(find . -type f -iname "*.txt"); awk 'NR==2' $file >> output.txt

그리고 파일에 확장자가 없으면 txt모든 파일에 공통된 패턴을 사용할 수 있습니다. 모든 파일의 File이름에 해당 이름이 있다고 가정하면 awk버전은 다음과 같을 수 있습니다.

for file in $(find . -type f -iname "*File*"); awk 'NR==2' $file >> output.txt

편집 2:

언급하신 내용에 따르면 FstRslts합계는 GenDivRslts파일 그룹의 고유 식별자입니다. 따라서 파일 "*FstRslts"에 대해 FstRslts대신 사용할 수 있습니다 "*.txt".GenDivRslts

노트

나는 @steeldrivers의 조언과 교훈을 받아들이고 답변 중 하나로 다음을 추가합니다(보다 관용적임).

find . -type f -iname "*FstRslts" -exec awk 'NR==2' {} \; > output.txt

편집 3 find .- 현재 작업 디렉토리에서 검색 시작

type -f- 파일 형식 검색

-iname "*FstRslts"- 패턴과 일치하는 파일명 검색 시 대소문자 무시

-exec- 다음 명령을 실행합니다.

awk 'NR==2'- 이전 명령으로 발견된 각 파일의 두 번째 줄 추출(일치하는 패턴)

{} \;- 파일(패턴 일치) 명령 종료를 위한 자리 표시자

> output.txt- 결과를 "output.txt" 파일 이름으로 리디렉션합니다.

관련 정보