फ़ील्ड के आधार पर Input.csv फ़ाइल को सॉर्ट करना चाहते हैं $1 and $5 और देशवार A-Z order उत्पन्न करना चाहते हैं। सॉर्ट करते समय देश के नाम पर $ 1 या $ 5 से विचार करने की आवश्यकता है यदि कोई फ़ील्ड खाली है।

इनपुट.सीएसवी

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,,,,,

वांछित आउटपुट.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

मैंने कमांड के नीचे कोशिश की है लेकिन वांछित आउटपुट नहीं मिल रहा है। कृपया सुझाव दे..

head -1 Input.csv > Output.csv;  sort -t, -k1,1 -k5,5 <(tail -n +2 Input.csv) >> Output.csv
0
VNA 14 सितंबर 2017, 19:30

2 जवाब

सबसे बढ़िया उत्तर

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
3
karakfa 14 सितंबर 2017, 20:24

क्या ये वही है जो तुम चाहते हो? (छोड़ी गई पहली पंक्ति)

cat file_containing_your_lines | awk 'NR != 1'  | sed "s/,/\t/g" | sort -k 1 -k 5 | sed "s/\t/,/g"
0
PejoPhylo 14 सितंबर 2017, 20:18