2014-07-23 6 views
0

많은 조작이 필요한 csv 파일이 있습니다. 어쩌면 awk와 sed를 사용하면 될까요?csv 조작을 위해 sed, awk 또는 sort 사용

입력 :

"Sequence","Fat","Protein","Lactose","Other Solids","MUN","SCC","Batch Name" 
1,4.29,3.3,4.69,5.6,11,75,"35361305a" 
2,5.87,3.58,4.41,5.32,10.9,178,"35361305a" 
3,4.01,3.75,4.75,5.66,12.2,35,"35361305a" 
4,6.43,3.61,3.56,4.41,9.6,275,"35361305a" 

최종 출력 :

43330075995647 
59360178995344 
40380035995748 
64360275964436 

내가 그것을 단계적으로가는 중 일부를 통해 얻을 수 있어요.
특정 열을 9.9 이상의 값으로 테스트하고 9.9로 바꾸려면 어떻게합니까?
또한 이러한 단계를 결합하는 방법이 있습니까?

tail -n +2 test.csv > test1.txt 

제거 콤마 :

sed 's/,/ /g' test1.txt > test2.txt 

제거 지수 :

sed 's/"//g' test2.txt > test3.txt 

컬럼 1을 제거하고 8 1,2- 같은
재정렬 나머지 열

첫번째 행을 삭제 , 6,5,4,3 :

sort test3.txt | uniq -c | awk '{print $3 "\t" $4 "\t" $8 "\t" $7 "\t" $6 "\t" $5}' test4.txt 

테스트 새 열 -1,2,4,5,6,7- - 값이 9.9 이상이면, 이전 질문에서 발견 된 다음과 같은 부품에 대한 9.9

How should I do this step? 

솔루션으로 교체 - reformating a text file

마침표 공백


012 제거 기입 에바에 열 -1,2,4,5,6,7- 라운드 소수
칼럼 (3 개)의 요구가 남아 제로를 사용하여, 네 개의 문자 길게 356,799,917,926,859,297,443,210
+0

당신이 비트를 할 수없는 이유는 무엇입니까? 현재이 기능은 질문이 아닌 구현하려는 기능 목록과 같습니다. –

+0

공정 함 - 테스트 항목 1,2,4,5,6 - 값이 9.9 이상인 경우 9.9 – user2052255

+0

으로 바꿉니다. 문제가있는 부분을 명확하게 나타내려면 질문을 편집해야합니다. –

답변

0

이 원본 파일에서 원하는 출력을 생성합니다. 사용자가 지정한 질문에 그 주 - 대신 소수점 한자리로 반올림 한 원하는 출력 "열 4 라운드 정수로"만에 지정된 질문에 그주의 : I 필드를 지정

awk -F'[,"]+' 'function m(x) { return x < 9.9 ? x : 9.9 } 
NR > 1 { 
    s = sprintf("%.1f%.1f%04d%.1f%.1f%.1f", m($2),m($3),$7,m($6),m($5),m($4)) 
    gsub(/\./, "", s) 
    print s 
}' test.csv 

구분 기호를 쉼표와 큰 따옴표로 구분하여 추가 단계가 필요없이 CSV 형식을 "파싱"합니다.

함수 m은 최소 9.9와 전달 숫자를 반환합니다.

출력 :

43330075995647 
59360178995344 
40380035995748 
64360275964436 
+0

당신은'% 04d'에 대해 확신합니까? :) – konsolebox

+0

@konsolebox 정수 필드처럼 보이므로 "열 3은 길이가 4 문자 여야하며 0부터 왼쪽 채우기"부분을 사용해야합니다. –

+0

@TomFenech이 문제를 해결하는 데 도움을 주셔서 감사하며 내 질문에 대해 명확히 설명해 주셔서 감사합니다. – user2052255

0

한 이동에서 처음 세 :

awk -F, '{gsub(/"/,"");$1=$1} NR>1' test.csc 
1 4.29 3.3 4.69 5.6 11 75 35361305a 
2 5.87 3.58 4.41 5.32 10.9 178 35361305a 
3 4.01 3.75 4.75 5.66 12.2 35 35361305a 
4 6.43 3.61 3.56 4.41 9.6 275 35361305a 
-1
tail -n +2 file | sort -u | awk -F , ' 
    { 
     $0 = $1 FS $2 FS $6 FS $5 FS $4 FS $3 
     for (i = 1; i <= 6; ++i) 
      if ($i > 9.9) 
       $i = 9.9 
     $0 = sprintf("%.1f%.1f%4s%.0f%.1f%.1f", $1, $2, $3, $4, $5, $6) 
     gsub(/ /, "0"); gsub(/[.]/, "") 
     print 
    } 
' 

또는

< file awk -F , ' 
    NR > 1 { 
     $0 = $1 FS $2 FS $6 FS $5 FS $4 FS $3 
     for (i = 1; i <= 6; ++i) 
      if ($i > 9.9) 
       $i = 9.9 
     $0 = sprintf("%.1f%.1f%4s%.0f%.1f%.1f", $1, $2, $3, $4, $5, $6) 
     gsub(/ /, "0"); gsub(/[.]/, "") 
     print 
    } 
' 

출력 :

104309964733 
205909954436 
304009964838 
406409643636 
+0

출력은 OP가 원하는 것과 완전히 다릅니다. –

+0

@TomFenech 예 질문이 진지하다고 생각하지 않기 때문에 문제가되지 않습니다. – konsolebox

관련 문제