![](/img/trans.png)
[英]How to remove double quotes in a specific column by using sub() in AWK
[英]How to remove a specific column from a file using awk?
大家好,我正在處理如下文本:
& & Training & & & & Early birds & & & & & Test & \\\hline
& EN & ES & IT & DU & EN & ES & IT & DU & EN & ES & IT & DU \\\hline
Users & 152 & 110 & 38 & 34& 42 & 30 & 12 & 10 & 142 & 88 & 36 & 32 \\\hline
18-24 & 58 & 22 & & & 16 & 6 & & & 56 & 18 & & \\
25-34 & 60 & 56 & & &16 & 14 & & & 58 & 44 & &\\
35-49 & 22 & 22 & & & 6& 6 & & & 20 & 18 & &\\
50+ & 12 & 10 & & & 4& 4 & & & 8 &8 & & \\\hline
我將&符號用作列分隔符,我想使用awk刪除text.txt的七列,我嘗試過:
awk -F "&" '{print $7}' text.txt
我得到:
Early birds
ES
30
6
14
6
4
這是我要從text.txt中刪除的列,我想使用awk來實現這一點,我想感謝任何建議。
sed
對此非常有效:
$ sed -E 's/(([^&]*&){6})[^&]*&/\1/' text.txt
& & Training & & & & & & & & Test & \\\hline
& EN & ES & IT & DU & EN & IT & DU & EN & ES & IT & DU \\\hline
Users & 152 & 110 & 38 & 34& 42 & 12 & 10 & 142 & 88 & 36 & 32 \\\hline
18-24 & 58 & 22 & & & 16 & & & 56 & 18 & & \\
25-34 & 60 & 56 & & &16 & & & 58 & 44 & &\\
35-49 & 22 & 22 & & & 6& & & 20 & 18 & &\\
50+ & 12 & 10 & & & 4& & & 8 &8 & & \\\hline
(([^&]*&){6})
匹配前六列,並將它們保存在\\1
組中。 [^&]*&
匹配第七個。 所有這些都只替換為前六列\\1
。
使用gensub()的GNU awk:
$ awk '{print gensub(/(([^&]*&){6})[^&]*&/,"\\1",1)}' file
& & Training & & & & & & & & Test & \\\hline
& EN & ES & IT & DU & EN & IT & DU & EN & ES & IT & DU \\\hline
Users & 152 & 110 & 38 & 34& 42 & 12 & 10 & 142 & 88 & 36 & 32 \\\hline
18-24 & 58 & 22 & & & 16 & & & 56 & 18 & & \\
25-34 & 60 & 56 & & &16 & & & 58 & 44 & &\\
35-49 & 22 & 22 & & & 6& & & 20 & 18 & &\\
50+ & 12 & 10 & & & 4& & & 8 &8 & & \\\hline
與其他awk相比,還有更多工作:
$ awk 'match($0,/([^&]*&){7}/) { tgt=substr($0,1,RLENGTH); sub(/[^&]*&$/,"",tgt); $0=tgt substr($0,RLENGTH+1) } 1' file
& & Training & & & & & & & & Test & \\\hline
& EN & ES & IT & DU & EN & IT & DU & EN & ES & IT & DU \\\hline
Users & 152 & 110 & 38 & 34& 42 & 12 & 10 & 142 & 88 & 36 & 32 \\\hline
18-24 & 58 & 22 & & & 16 & & & 56 & 18 & & \\
25-34 & 60 & 56 & & &16 & & & 58 & 44 & &\\
35-49 & 22 & 22 & & & 6& & & 20 & 18 & &\\
50+ & 12 & 10 & & & 4& & & 8 &8 & & \\\hline
或因為您有字符串FS而不是正則表達式:
$ awk 'BEGIN{FS=OFS="&"} { j=0; for (i=1;i<=NF;i++) if (i!=7) printf "%s%s",(++j>1?OFS:""),$i; print "" }' file
& & Training & & & & & & & & Test & \\\hline
& EN & ES & IT & DU & EN & IT & DU & EN & ES & IT & DU \\\hline
Users & 152 & 110 & 38 & 34& 42 & 12 & 10 & 142 & 88 & 36 & 32 \\\hline
18-24 & 58 & 22 & & & 16 & & & 56 & 18 & & \\
25-34 & 60 & 56 & & &16 & & & 58 & 44 & &\\
35-49 & 22 & 22 & & & 6& & & 20 & 18 & &\\
50+ & 12 & 10 & & & 4& & & 8 &8 & & \\\hline
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.