2017-09-14 162 views
0

想根据字段$1 and $5Input.csv文件进行排序,并生成国家明智的A-Z order。 在做排序时,如果任何字段为空,则需要考虑国家名称,或者从$ 1或$ 5。awk对两个字段进行排序:

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

期望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 

我曾尝试下面的命令,但没有得到期望的输出。请建议..

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

住所,我已经重新检查没有在预期的输出没有错 – 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}'file | sort -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 

输出如下。

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 

如果您的语言环境未设置为en_US,尝试改变sortLC_ALL=en_US sort

+0

谢谢你,RavinderSingh13,对不起,我没有得到像你这样的订单,我的输出基于你的命令 – VNA

+0

国家,金额,Des,详细信息,国家,金额,Des,网络,详细信息 ,,,, ghi,30,AL ,DEF〜PQZ,Sep ,,,, mno,50,DL,ABC〜XYZ,Sep 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 ,,, ,, jkl,40,11-Sep-13,Aug ,,,,, – VNA

+0

尝试更改与LC_ALL = en_US排序,然后让我知道呢? – RavinderSingh13

相关问题