python 및 gnu-parallel을 사용하여 출력 처리 테스트에서 헤더 행을 하나만 유지하는 방법은 무엇입니까?

ChrisP

문제

종종 여러 CSV 파일의 디렉토리를 처리하고 단일 출력 파일을 생성해야합니다. 종종 저는 이러한 작업을 동시에 실행하기 위해 GNU 병렬에 의존합니다. 그러나 출력을 반환하는 첫 번째 작업을 제외한 모든 작업에 대해 첫 번째 행 (헤더)을 삭제하는 방법이 필요합니다.

이를 구체적으로 만들기 위해 다음과 같은 여러 CSV 파일의 디렉토리를 상상해보십시오.

x,y
1,1.2
2,5.3
3,6.0

그런 다음 calc.py데이터를 정리하거나 계산을 수행 하는 (Python) 스크립트 가 있습니다.

import csv
import math
import sys

rdr = csv.DictReader(sys.stdin)
wtr = csv.DictWriter(sys.stdout, fieldnames=['x', 'y', 'siny'])
wtr.writeheader()

for row in rdr:
    row['siny'] = math.sin(float(row['y']))
    wtr.writerow(row)

그런 다음 GNU 병렬과 병렬로 데이터 파일을 처리 할 수 ​​있습니다.

parallel --lb python calc.py '<' {} ::: $(ls -1 *.csv)

그러나 이것은 여러 헤더 행을 생성합니다. 예를 들면 ...

x,y,siny
1,1.2,0.9320390859672263
2,5.3,-0.8322674422239013
3,6.0,-0.27941549819892586
x,y,siny
4,7.2,0.7936678638491531
5,2.2,0.8084964038195901
6,0.9,0.7833269096274833

출력parallel 에서 첫 번째 헤더 줄만 유지 하는 간단한 방법 (이상적으로는 옵션 )을 찾고 있습니다. 매뉴얼의 헤더와 관련된 내용은 입력에 관한 것 같습니다.

가능한 해결책

몇 가지 옵션이 있지만 그중 어느 것도 좋아하지 않습니다 ...

  1. calc.py헤더를 출력 하지 않고 대신 병렬 실행 전에 헤더를 에코합니다. 단점은 헤더를 알고 있어야하거나 실행 python calc.py data1.csv | head -n 1하기 전에 같은 것을 실행하여 헤더를 들여다 봐야한다는 것 parallel입니다.
  2. 별도의 파일로 각 작업의 출력을 저장 한 후 (예를 들면로 사후을 연결 xsv, tail, sed모든하지만 첫 번째의 헤더를 제거, 등). 이것은 디스크에서 추가 파일을 관리하고 나중에 정리해야하는 단점이 있습니다.
  3. 이를 수행하는 다른 프로그램을 작성하고 그 결과를 파이프합니다 parallel.
    • 각 출력 라인을 첫 번째 라인과 비교하는 데 CPU 집약적이며 일치하는 레코드가 거의 없음을 알고 있습니다.
    • 헤더 행과 일치하는 유효한 데이터 레코드가 없다고 가정합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 각 작업의 출력에서 ​​하나의 헤더 행을 제외하고 모두 무시하도록 병렬에 지시하는 옵션이 있습니까?

올레 탄게

옵션 1을 조정하는 것은 어떻습니까?

프로그램이 두 개의 인수를 갖도록하십시오 : 파일 jobnumber

if jobnumber == 1:
  output header

작업 1이 먼저 인쇄되도록하려면 --keep-order다음을 사용하십시오 .

parallel --keep-order python calc.py {#} '<' {} ::: *.csv

GNU Parallel은 실행중인 작업의 출력을 / tmp에 캐시하여 출력을 직렬화합니다. 이는 --lb.

일반적으로 다음과 같이 할 수 있습니다.

parallel -k python 'calc.py < {} {= uq; $_ = seq()==1 ? "" : "| tail +2" =}' ::: *.csv

uq 20190722부터 사용할 수 있습니다.

을 실행할 것이므로 tail약간 느릴 수 있습니다. 내 시스템에서 tail코어 당 0.5GB / s를 제공합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관