在匹配给定数量的特定字符的行上的Sed

时间:2017-08-14 08:24:11

标签: awk sed xargs

我的档案:

Nicole,Foo,senior,Lexington
John,Doe,junior,Chicago
John,Fool,True,junior,Detroit
Lara,True,Fool,senior,Miami

我想要的:当有四个逗号而不是三个逗号时,删除第二个逗号:

Nicole,Foo,senior,Lexington
John,Doe,junior,Chicago
John,Fool True,junior,Detroit
Lara,True Fool,senior,Miami

我尝试了什么:

用四个逗号检测行:

awk -F, '{print NF-1; next; print $0}' myfile

删除一行中的第二个逗号:

sed 's/,/ /2' myfile

我仍然无法做到: 合并这两个命令,仅将sed命令应用于包含4个逗号的行。我怀疑它可以用xargs以某种方式完成,但我不知道如何使用这种条件声明来处理它。

也许有人可以给我一些方向?

4 个答案:

答案 0 :(得分:1)

试试这个:

sed '/\([^,]*,\)\{4\}/s/,/ /2' file

当找到4个非逗号字符串后跟逗号的序列时,用空格替换第二个逗号。

答案 1 :(得分:0)

在awk中(我将sed用于此):

$ awk '
BEGIN { FS=OFS="," }               # separators
NF==5 {                            # for five-fielded records
    for(i=2;i<NF;i++)              # starting from the second
        $i=(i==2?$i " ":"") $(i+1) # append or replace with the next field
    NF=4                           # reduce the field count for those records
}1' file
Nicole,Foo,senior,Lexington
John,Doe,junior,Chicago
John,Fool True,junior,Detroit
Lara,True Fool,senior,Miami

答案 2 :(得分:0)

也请尝试以下awk:

awk -F, '{for(i=1;i<=NF;i++){if(NF>4){if(i==2){$i=$i " "$(i+1)};if(i==3){continue}};printf("%s%s",$i,i==NF?"":",");}print ""}'   Input_file

OR

awk -F, '{
for(i=1;i<=NF;i++){
  if(NF>4){
  if(i==2){
    $i=$i " "$(i+1)
  };
  if(i==3){
   continue
  }
  };
  printf("%s%s",$i,i==NF?"":",");
  }
  print ""
}'  Input_file

答案 3 :(得分:0)

gawk '/Fool,|True,/{$0=gensub(/,/," ",2)}1' file

Nicole,Foo,senior,Lexington
John,Doe,junior,Chicago
John,Fool True,junior,Detroit
Lara,True Fool,senior,Miami