2012-04-14 49 views

回答

7

假設空間是字段內容的一部分,分隔符是「@」單獨(雖然其他的變化可以很容易地適應):

awk 'BEGIN {FS = OFS = "@"} {$5 = $5; print}' inputfile 

AWK創建缺少中間字段。如果該字段已存在或將其設置爲任何中間創建的字段以清空字符串,則將字段值設置爲自身可保留現有內容。

$ cat inputfile 
A @ B @ C @ D @ E 
A @ B @ C @ D 
A @ B @ C 
$ awk 'BEGIN {FS = OFS = "@"} {$5 = $5; print}' inputfile 
A @ B @ C @ D @ E 
A @ B @ C @ D @ 
A @ B @ C @@ 
+1

或者,你可以說'{NF = 5;打印}',達到相同的結果。 – 2012-04-20 13:58:29

+0

@glennjackman:除了礦區保留超過五個記錄的字段以及你的記錄截斷到五個字段。哪一個是理想的取決於特定的要求。 – 2012-04-20 16:35:37

+0

+1這非常聰明。這是記錄在任何地方? – 2014-05-01 18:58:54

1

像這樣的東西可以工作:

cat foo.csv | sed -E "s/([^\@]+\@){3}([^\@]+)/&@/" | sed -E "s/\@\@/\@/" 

這讀取foo.csv文件,那麼第四欄後加@,然後刪除上已經有一個線的重複。

1

如果你可以使用Python,這裏有一個稍微聰明的解決方案,增加了許多@「的必要:

from sys import * 

for line in stdin.readlines(): 
    stdout.write(line.strip()) 
    if (line.count('@') < int(argv[1])): 
     stdout.write(' @' * (int(argv[1]) - line.count('@'))) 
    stdout.write('\n') 

這樣稱呼它:cat foo.csv | python fixcsv.py 4

1
awk -F'@' '{printf $0; if (NF == 4) {print "@"}}' 

注:輸入A @ B @ C @ D會導致輸出A @ B @ C @ [email protected]。我故意將第4個值保持不變,但您當然可以選擇添加額外空間

+1

因爲你放棄了換行,你需要添加別的'打印 「」' – 2012-04-14 14:24:04

1

假設您的字段不能包含@,並且只希望在有4個字段時發生替換,則應該是工作sed解決方案:

$ sed -r 's/^([^@]*[[:space:]]@){3}[^@]+$/& @/' <<EOF 
> A @ B @ C @ D @ E 
> A @ B @ C @ D 
> EOF 
A @ B @ C @ D @ E 
A @ B @ C @ D @ 

請注意sed -r假定GNU sed。

替換爲不同的重定向以便與文件一起使用。

2

這可能會爲你工作:

sed 's/@/&/4;t;s/\s*$/ @/' file 
2

未經檢驗的,但這樣的:

perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)' 
相關問題