如果倒数第二个或倒数第二个字符是CSV的第一列中的空格,请删除行

时间:2019-07-16 09:31:51

标签: awk sed

首先,我很抱歉没有给出我尝试过的示例,因为我真的不知道从哪里开始。据我所知,这是SED或AWK的工作。

在以下情况下,我想删除行

  • 第二个字符是第一列中的空格
  • 倒数第二个字符是第一列中的空格

示例输入

John Smith|Chicago|IL
J Smith|Chicago|IL
Jane Brown|New York|NY
Jane B|New York|NY

预期产量

John Smith|Chicago|IL
Jane Brown|New York|NY

文件是|分隔,其中一些包含4列数据,另一些包含5列或更多列(我知道这是错误的格式,但这是我试图帮助他们的由NGO收集的数据),但在每种情况下,我都希望这样文件的第一列。

5 个答案:

答案 0 :(得分:3)

我只是将您的两个条件转换为regexp,然后将grep与选项-v一起使用以删除这些模式

第二个字符是第一列中的空格-> ^[^|]

倒数第二个字符是第一列中的空格-> ^[^|]* [^|]\|

grep -Ev '(^[^|] )|(^[^|]* [^|]\|)' <input>

结果:

John Smith|Chicago|IL
Jane Brown|New York|NY

答案 1 :(得分:2)

awk应该这样做:

awk -F\| '{s=split($1,a,"")} !(a[2]==" " || a[s-1]==" ")' file
John Smith|Chicago|IL
Jane Brown|New York|NY

它将第一个字段inn拆分为数组a和长度为s。然后测试第二个和倒数第二个是否为空。
易于阅读,易于理解:)

答案 2 :(得分:2)

$ awk -F'|' '$1 !~ /^. | .$/' file
John Smith|Chicago|IL
Jane Brown|New York|NY

答案 3 :(得分:1)

请您尝试以下。

awk 'BEGIN{FS=OFS="|"} substr($1,2,1)==" " || substr($1,length($1)-1,1)==" "{next} 1'  Input_file

答案 4 :(得分:1)

“ Corentin Limier”答案的较小版本

  grep -Ev '(^. )|(^* .\|)' filename

结果:

 John Smith|Chicago|IL
 Jane Brown|New York|NY

使用“ sed”命令也可能实现

  sed '/^. /d' filename | sed '/ .|/d'