簡體   English   中英

如何使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM