2017-08-14 85 views
0

我的文件:桑達匹配特定字符的給定數量的行

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完成,但我不知道如何用這樣的條件語句來處理它。

也許有人可以給我一些方向?

回答

1

嘗試這種情況:

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

當後跟一個逗號非逗號串的4個序列被發現,用空格替換第二逗號。

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 
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 
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 
相關問題