我有此格式的CSV文件:如何添加額外的分隔符到CSV文件的末尾有些被發現缺失?
A @ B @ C @ D @ E
它應該有五列,遺憾的是,一些缺少最後一列,例如:
A @ B @ C @ D
我如何添加一個額外的@
到每一行缺少最後一列的結尾?
我有此格式的CSV文件:如何添加額外的分隔符到CSV文件的末尾有些被發現缺失?
A @ B @ C @ D @ E
它應該有五列,遺憾的是,一些缺少最後一列,例如:
A @ B @ C @ D
我如何添加一個額外的@
到每一行缺少最後一列的結尾?
假設空間是字段內容的一部分,分隔符是「@」單獨(雖然其他的變化可以很容易地適應):
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 @@
像這樣的東西可以工作:
cat foo.csv | sed -E "s/([^\@]+\@){3}([^\@]+)/&@/" | sed -E "s/\@\@/\@/"
這讀取foo.csv文件,那麼第四欄後加@,然後刪除上已經有一個線的重複。
如果你可以使用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
awk -F'@' '{printf $0; if (NF == 4) {print "@"}}'
注:輸入A @ B @ C @ D
會導致輸出A @ B @ C @ [email protected]
。我故意將第4個值保持不變,但您當然可以選擇添加額外空間
因爲你放棄了換行,你需要添加別的'打印 「」' – 2012-04-14 14:24:04
假設您的字段不能包含@,並且只希望在有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。
替換爲不同的重定向以便與文件一起使用。
這可能會爲你工作:
sed 's/@/&/4;t;s/\s*$/ @/' file
未經檢驗的,但這樣的:
perl -lpe '$n = tr/@/@/; $_ .= "@" x (4-$n)'
或者,你可以說'{NF = 5;打印}',達到相同的結果。 – 2012-04-20 13:58:29
@glennjackman:除了礦區保留超過五個記錄的字段以及你的記錄截斷到五個字段。哪一個是理想的取決於特定的要求。 – 2012-04-20 16:35:37
+1這非常聰明。這是記錄在任何地方? – 2014-05-01 18:58:54