将包含空白字段和​​不包含空白字段的所有行打印到单独的文件中

时间:2019-05-12 11:44:44

标签: bash awk sed grep

我有一个带有col1,col2,col3,col4的.csv文件,我想消除那些在col4中没有任何值的行。

col1 col2 col3 col4
----------------------
1,    xx,  yy,  zz,
2,    aa,  bb,    ,
3,    cc,  dd,  ee,
4,    ff,  gg,    ,
5,    hh,  ii,    ,

我希望您返回2个文件,其中一个带有:

col1 col2 col3 col4
---------------------
1,    xx,  yy,  zz,
3,    cc,  dd,  ee,

和另外一个:

col1 col2 col3 col4
---------------------
2,    aa,   bb,    ,
4,    ff,   gg,    ,
5,    hh,   ii,    ,

使用awk,sed,grep之类的工具可以做到这一点……我不知道该怎么做打印带有空列4或NULL的行。

3 个答案:

答案 0 :(得分:1)

如图所示,您的数据文件不符合CSV规则,因为第1行不是逗号分隔。如果逗号之间有空格,那么您将需要一些更复杂的东西,但是如果文件看起来像这样:

1..

然后这些将根据需要分隔行:

1,xx,yy,zz, 2,aa,bb,, 3,cc,dd,ee, 4,ff,gg,, 5,hh,ii,,

awk -F, '{if(length($4)>0){print}}' col.csv

第一个给出第1行和第3行,第二个给出2,4和5。

答案 1 :(得分:1)

在埃德·莫顿发现错误之后,对此进行了实质性修改。

您可以使用AWK轻松做到这一点:

awk -F' *, *' '
  $4 == "" {
    print > "FILE1.csv"
  }
  $4 != "" {
    print > "FILE2.csv"
  }
  ' FILE.csv

说明:

  • -F将字段分隔符设置为逗号,并且任意两边都可以有空格 1
  • 当字段4为空时,将这些行打印到FILE1.csv中;当字段4不为空时,将这些行打印到FILE2.csv中。

或更简洁:

awk -F' *, *' '{print > ("FILE" ($4=="" ? 1 : 2) ".csv")}' FILE.csv

1 请注意,有人质疑OP是否具有制表符加逗号或空格加逗号分隔文件。如果文件包含标签,它将显示为:

1,  xx, yy, zz,
2,  aa, bb, ,
3,  cc, dd, ee,
4,  ff, gg, ,
5,  hh, ii, ,

在我看来,OP的文件是空格且以逗号分隔,并且向下投票不公平。

答案 2 :(得分:0)

或者,您也可以使用grep来做到这一点:

如果您需要colx

echo "col1 col2 col3 col4" > with.txt && echo "col1 col2 col3 col4" > without.txt

检索数据并保存到两个文件中:

 grep -P "\w*?,\s*\w*?,\s*\w*?,\s*\w+," test.csv >> with.txt
 grep -P "\w*?,\s*\w*?,\s*\w*?,\s*," test.csv >> without.txt

请注意,使用>会清除文件,然后在附加>>的同时写入文件。