如何使用awk从文件中删除特定列?

时间:2016-05-28 00:11:12

标签: bash 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实现这一点,我想感谢任何建议。

2 个答案:

答案 0 :(得分:4)

(([^&]*&){6})适用于此:

\1

[^&]*&与前六列匹配,并将其保存在组\1中。 c3.generate({ bindto: '#unlimited-bar-graph', data: { x : 'x', columns: [ ['x', 'Auto', 'M2M'], ['Renew', 20,200,300], ['Return', 10,20,30], ['Sign Up', 12, 10, 10], ], type: 'bar', groups: [ ['Renew', 'Return', 'Sign Up'] ] }, axis: { x: { type: 'category' // this is needed to load string x value } }, grid: { y: { lines: [{value:0}] } } }); 匹配第七个。所有这些都只被前六列{{1}}替换。

答案 1 :(得分:2)

使用GNU awk for gensub():

$ 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 '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