2017-09-14 3 views
0

Input.csv 파일을 $1 and $5 필드를 기준으로 정렬하고 국가를 생성 하시겠습니까? A-Z order. 필드 중 하나라도 비어 있으면 정렬을 수행하는 동안 $ 1 또는 $ 5에서 국가 이름을 고려해야합니다.awk는 두 개의 필드를 정렬합니다.

내가 명령 아래 시도했지만 출력을 원하는 가져 오지 Output.csv

Country,Amt,Des,Details,Country,Amt,Des,Network,Details 
abc,10,03-Apr-14,Aug,abc,10,DL,ABC~XYZ,Sep 
abc,10,22-Jan-07,Aug,abc,10,DL,ABC~XYZ,Sep 
abc,10,03-Apr-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,19-Feb-14,Aug,abc,10,MN,ABC~XYZ,Sep 
def,20,02-Jul-13,Aug,,,,, 
def,20,02-Aug-13,Aug,,,,, 
,,,,ghi,30,AL,DEF~PQZ,Sep 
jkl,40,11-Sep-13,Aug,,,,, 
,,,,mno,50,DL,ABC~XYZ,Sep 

을 원하는 Input.csv

Country,Amt,Des,Details,Country,Amt,Des,Network,Details 
abc,10,03-Apr-14,Aug,abc,10,DL,ABC~XYZ,Sep 
,,,,mno,50,DL,ABC~XYZ,Sep 
abc,10,22-Jan-07,Aug,abc,10,DL,ABC~XYZ,Sep 
jkl,40,11-Sep-13,Aug,,,,, 
,,,,ghi,30,AL,DEF~PQZ,Sep 
abc,10,03-Apr-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,19-Feb-14,Aug,abc,10,MN,ABC~XYZ,Sep 
def,20,02-Jul-13,Aug,,,,, 
def,20,02-Aug-13,Aug,,,,, 

은. 제발 ..

head -1 Input.csv > Output.csv; sort -t, -k1,1 -k5,5 <(tail -n +2 Input.csv) >> Output.csv 
+0

쉼터와 sort을 변경해보십시오, 나는 예상되는 출력의 실수 명령이 아닌 이상 – VNA

답변

3

awk!

$ awk -F, '{print ($1==""?$5:$1) "\t" $0}' file | sort | cut -f2- 

Country,Amt,Des,Details,Country,Amt,Des,Network,Details 
abc,10,03-Apr-14,Aug,abc,10,DL,ABC~XYZ,Sep 
abc,10,03-Apr-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,19-Feb-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,22-Jan-07,Aug,abc,10,DL,ABC~XYZ,Sep 
def,20,02-Aug-13,Aug,,,,, 
def,20,02-Jul-13,Aug,,,,, 
,,,,ghi,30,AL,DEF~PQZ,Sep 
jkl,40,11-Sep-13,Aug,,,,, 
,,,,mno,50,DL,ABC~XYZ,Sep 

여기서 대문자로 시작하는 헤더는 소문자입니다. 이렇게하면 다음과 같은 노력이 당신을 도움이 있으면 알려 주시기 바랍니다 수 awk

$ awk -F, 'NR==1{print; next} {print ($1==""?$5:$1) "\t" $0 | "sort | cut -f2-"}' file 
+0

감사합니다, 카라 카파, 실제 데이터는 아프가니스탄, 베냉, 카보 베르데, 크로아티아 같은 대문자로 시작합니다. 짐바브웨 – VNA

+0

아주 가깝지만'awk -F, -v OFS = '여야합니다. \ t "{print (NR> 1? 1 : 0), ($ 1 ==" "? $ 5 : $ 1), $ 0} '파일 | 정렬 -k1,2 | cut -f3-'헤더 행이 맨 위에 오도록합니다. –

+1

에드 모튼 감사합니다 – VNA

0

이게이게 뭡니까? (생략 첫 번째 줄) 구조에

cat file_containing_your_lines | awk 'NR != 1' | sed "s/,/\t/g" | sort -k 1 -k 5 | sed "s/\t/,/g" 
+0

이 PejoPhylo 죄송합니다, 감사가없는 다시 확인했다 원하는 출력을 생성하십시오 – VNA

0

위에서 또는 더 나은처럼 필요한 헤더의 유효한 가정 특수 처리가되지 않습니다. 머리, 꼬리, 정렬 솔루션 :

head -n 1 Input_file && tail -n +2 Input_file | sort -k1.1 -k5.1 

출력은 다음과 같습니다. 로케일이 ko 페이지로 설정되지 않은 경우

Country,Amt,Des,Details,Country,Amt,Des,Network,Details 
abc,10,03-Apr-14,Aug,abc,10,DL,ABC~XYZ,Sep 
abc,10,03-Apr-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,19-Feb-14,Aug,abc,10,MN,ABC~XYZ,Sep 
abc,10,22-Jan-07,Aug,abc,10,DL,ABC~XYZ,Sep 
def,20,02-Aug-13,Aug,,,,, 
def,20,02-Jul-13,Aug,,,,, 
,,,,ghi,30,AL,DEF~PQZ,Sep 
jkl,40,11-Sep-13,Aug,,,,, 
,,,,mno,50,DL,ABC~XYZ,Sep 

LC_ALL=en_US sort

+0

감사합니다, RavinderSingh13, 죄송합니다. 귀하의 명령에 따라 출력이 달라질 수 있습니다. – VNA

+0

국가, Amt, Des, 세부 정보, 국가, Amt, Des, 네트워크, 세부 사항 ,,,, ghi, 30, AL , DEF ~ PQZ, Sep ,,,, mno, 50, DL, ABC ~ XYZ, Sep abc, 10,03-4 월 14, 8 월, abc, 10, DL, ABC ~ XYZ, 9 월 abc, 10 , 03-Apr-14, Aug, abc, 10, MN, ABC ~ XYZ, Sep abc, 10 월 19 일 -2 월 14 일, 8 월, abc, 10, MN, ABC ~ XYZ, Sep abc, 10,22 -Jan-07, Aug, abc, 10, DL, ABC ~ XYZ, Sep def, 20,02-Aug-13, Aug ,,,,, def, 20,02-Jul-13, Aug ,,, ,, jkl, 4011-Sep-13, Aug ,,,,, – VNA

+0

LC_ALL = en_US 정렬로 정렬을 변경해보고 알려 주시겠습니까? – RavinderSingh13

관련 문제