특수 문자로 시작하는 줄을 새 파일로 병합

특수 문자로 시작하는 줄을 새 파일로 병합

다음 상황: "dens_Run0_set0.#"이라는 이름의 파일이 약 2000개 있습니다. 여기서 #은 숫자이고 파일은 다음과 같이 채워집니다.

       1   0 1.000000e-01  6.3043370127282594e-01 -9.0687990423248266e-03  255 9.4509489123595358e-10 
       1   1 1.000000e-01  6.4071465952974904e-01  2.1357878278801461e-02  254 9.6824903650372107e-10 
       1   2 1.000000e-01  6.6258330124264830e-01 -8.3797056064819717e-03  255 9.5136742928048079e-10 
       1   3 1.000000e-01  6.2986715737376164e-01 -8.3306463914899122e-03  254 9.8325203534699313e-10 
       1   4 1.000000e-01  6.2984096793040101e-01 -2.2874605754168442e-03  255 9.7199825965788023e-10 
       1   5 1.000000e-01  6.3544494921916339e-01  4.0850692190967192e-04  255 9.3920704546945899e-10 
       1   6 1.000000e-01  6.1993535905745978e-01  1.6905867851164658e-03  255 9.2219992753328484e-10 
       1   7 1.000000e-01  6.6403589120818651e-01 -7.7065063672989709e-03  255 9.5683005962854395e-10 
       1   8 1.000000e-01  6.6151286798685760e-01  2.2987801390020952e-02  255 9.5036933878134278e-10 
       1   9 1.000000e-01  6.4426718104580993e-01 -9.1829913570412227e-03  255 9.5504193442508267e-10 
       6   0 1.000000e-01  4.0147426676412579e-02 -1.0968071205388696e-01  281 9.5556063062218755e-10 
       6   1 1.000000e-01  3.1792618041921133e-01  1.5324342699326129e-01  281 9.4066654465763122e-10 
       6   2 1.000000e-01  2.0570344663186310e-01 -5.7959543075412512e-02  281 9.4459629007559442e-10 
       6   3 1.000000e-01  1.4426831089076586e-01 -8.0085259971383493e-02  281 9.3488350394466124e-10 
       6   4 1.000000e-01  1.2697447761062600e-01 -7.9212954607404143e-02  281 9.4211360934792765e-10 
       6   5 1.000000e-01  9.4787370490545683e-02 -1.0902733768125472e-01  281 9.6087293677271646e-10 
       6   6 1.000000e-01 -3.6135020945645614e-02 -6.3683751812277478e-02  281 9.6366270518899455e-10 
       6   7 1.000000e-01  1.8645702206170731e-01 -1.1584221723023802e-01  281 9.7691299494329087e-10 
       6   8 1.000000e-01  3.4541099054452690e-01  5.8025780529230055e-02  281 9.4433605379862229e-10 
       6   9 1.000000e-01  2.6448819749081548e-01 -1.3873411819319395e-01  281 9.3928487210348521e-10 

이제 "1"로 시작하는 모든 2000개 파일의 모든 줄을 새 파일로 병합하고 "6"으로 시작하는 모든 파일을 다른 파일로 병합하고 싶습니다. 어떻게 해야 하나요?

답변1

사용 find및 전화 awk:

find . -maxdepth 1 -type f -name 'dens_Run0_set0.*' \
    -exec awk '{ print >>$1 ".output" }' {} +

find명령은 현재 디렉토리에서 이름이 주어진 패턴을 만족하는 모든 일반 파일을 찾습니다. 이러한 파일 배치의 경우 awk매우 짧은 프로그램이 실행됩니다.

프로그램 은 발견된 파일의 각 행을 첫 번째 필드의 데이터 와 유사 하거나 종속 awk된 이름을 가진 새 파일로 출력합니다 .1.output6.output

출력 파일이 아직 존재하지 않는다고 가정합니다(또는 기존 파일이 추가될 예정입니다). 또한 첫 번째 필드는 항상 유효한 안전한 파일 이름을 형성한다고 가정합니다(파일 시스템의 다른 곳에 있는 기존 파일을 덮어쓰는 것을 방지하는 검사는 없습니다).

첫 번째 필드에 정확히 두 개의 숫자 1 또는 6이 포함된 행만 처리하도록 프로그램을 제한하시겠습니까 awk(원하는 다른 숫자가 포함된 다른 행이 있는 경우)아니요추출하고 싶음) awk코드를 다음으로 변경하십시오.

$1 == 1 || $1 == 6 { print >>$1 ".output" }

시스템에 따라 다음과 같은 짧은 명령도 작동할 수 있습니다. 그렇지 않은 경우 파일이 너무 많기 때문에 "매개변수 목록이 너무 깁니다."라는 메시지가 표시됩니다.

awk '{ print >$1 ".output" }' dens_Run0_set0.*

위 명령은 find파일 배치(한 번에 모든 파일이 아닐 수도 있음)에서 여러 번 실행하여 이 오류를 해결합니다.awk

관련 정보