2016-10-18 4 views
0

나는 약 500 개의 행과 480K 개의 열을 가진 파일을 가지고 있으며, 결국 열 2,3을 이동해야합니다. 내 파일은 쉼표로 구분 된 파일입니다. awk 또는 sed를 사용하여이를 정리하는 더 빠른 방법이 있습니까?awk 또는 sed를 사용하여 열을 정렬 하시겠습니까?

+1

'붙여 넣기 -d , <(cut -d, -f1,5- input.txt) <(cut -d, -f2-4 input.txt) ' – twalberg

+0

무엇보다 빨리? 지금까지 해본 내용과 간결하고 검증 가능한 샘플 입력 및 예상 결과를 보여주는 질문. 즉. [mcve]를 제공하십시오. –

답변

2

당신은 솔루션 아래에 시도 할 수 있습니다 -

perl -F"," -lane 'print "@F[0]"," ","@F[4..$#F]"," ","@F[1..3]"' input.file 
+0

3,4 및 5를 끝으로 이동시키고 2를 제거합니다. –

+0

[한 명씩 오류] (http://martinfowler.com/bliki/TwoHardThings.html) –

1

열을 쉽게 복사 할 수 있으며, 480K 열에는 너무 오래 걸립니다.

$ awk 'BEGIN{FS=OFS=","} {print $0,$2,$3,$4}' input.file > output.file 

어떤 종류의 데이터 형식입니까? 5 개 필드

+0

이것은 게놈 데이터입니다. 우리는 450K 위치에 대해 각 개인을 테스트하고 있습니다. – Mdhale

1

테스트 :

$ cat foo 
1,2,3,4,5 
a,b,c,d,e 
$ cat program.awk 
{ 
    $6=$2 OFS $3 OFS $4 OFS $1 # copy fields to the end and $1 too 
    sub(/^([^,],){4}/,"")  # remove 4 first columns 
    $1=$5 OFS $1    # catenate current $5 (was $1) to $1 
    NF=4      # reduce NF 
} 1        # print 

실행을 :

$ awk -f program.awk FS=, OFS=, foo 
1,5,2,3,4 
a,e,b,c,d 

그래서 이론적으로이 작동합니다 : 그것은 일했다 :

{ 
    $480001=$2 OFS $3 OFS $4 OFS $1 
    sub(/^([^,],){4}/,"") 
    $1=$480000 OFS $1 
    NF=479999 
} 1 

편집 할 수 있습니다.

+1

내 이해는 480이 아니라 480,000 열입니다. – karakfa

1

아마도 펄 :

perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file 

또는

perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file 

또 다른 방법 : 정규 표현식

perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file 

500 선 파일로 타이밍을, 각 라인은 480,000 필드를 포함

$ time perl -F, -lane 'print join(",", @F[0,4..$#F,1,2,3])' file.csv > file2.csv 
40.13user 1.11system 0:43.92elapsed 93%CPU (0avgtext+0avgdata 67960maxresident)k 
0inputs+3172752outputs (0major+16088minor)pagefaults 0swaps 

$ time perl -F, -lane '@x = splice @F, 1, 3; print join(",", @F, @x)' file.csv > file2.csv 
34.82user 1.18system 0:38.47elapsed 93%CPU (0avgtext+0avgdata 52900maxresident)k 
0inputs+3172752outputs (0major+12301minor)pagefaults 0swaps 

그리고 순수한 텍스트 조작 우승자

$ time perl -lpe 's/^([^,]+)(,[^,]+,[^,]+,[^,]+)(.*)/$1$3$2/' file.csv > file2.csv 
4.63user 1.36system 0:20.81elapsed 28%CPU (0avgtext+0avgdata 20612maxresident)k 
0inputs+3172752outputs (0major+149866minor)pagefaults 0swaps 
+0

이렇게하려면 Perl 스크립트 작성이 끝났지 만이를 확인할 수도 있습니다. – Mdhale

+0

'시간'을 사용하여 480000 칼로 표시된 하나의 레코드에 대한 후자는 평균적으로 조금 더 빠릅니다. –

1

또 다른 기술을, 그냥 bash는 :

while IFS=, read -r a b c d e; do 
    echo "$a,$e,$b,$c,$d" 
done < file