종종 여러 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
에서 첫 번째 헤더 줄만 유지 하는 간단한 방법 (이상적으로는 옵션 )을 찾고 있습니다. 매뉴얼의 헤더와 관련된 내용은 입력에 관한 것 같습니다.
몇 가지 옵션이 있지만 그중 어느 것도 좋아하지 않습니다 ...
calc.py
헤더를 출력 하지 않고 대신 병렬 실행 전에 헤더를 에코합니다. 단점은 헤더를 알고 있어야하거나 실행 python calc.py data1.csv | head -n 1
하기 전에 같은 것을 실행하여 헤더를 들여다 봐야한다는 것 parallel
입니다.xsv
, tail
, sed
모든하지만 첫 번째의 헤더를 제거, 등). 이것은 디스크에서 추가 파일을 관리하고 나중에 정리해야하는 단점이 있습니다.parallel
.
이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 각 작업의 출력에서 하나의 헤더 행을 제외하고 모두 무시하도록 병렬에 지시하는 옵션이 있습니까?
옵션 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] 삭제
몇 마디 만하겠습니다