2016-05-28 7 views
1

Hallo, ich mit einem Text arbeite, die wie folgt aussieht:Wie man eine bestimmte Spalte mit awk aus einer Datei entfernt?

& & 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 

Ich bin mit dem & Symbol als Spaltentrennzeichen, ich möchte entfernen, um die sieben Spalte meiner text.txt mit awk, ich versucht:

awk -F "&" '{print $7}' text.txt 

und ich bekomme:

Early birds 
ES 
30 
6 
14 
6 
4 

, die die Säule ist, dass ich von meinem text.txt entfernen möchten, würde ich mag t Um dies mit awk zu erreichen, möchte ich jeden Vorschlag zu schätzen wissen.

Antwort

4

sed funktioniert gut für diese:

$ 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}) entspricht den ersten sechs Spalten und speichert sie in der Gruppe \1. [^&]*& entspricht der siebten. All das wird nur durch die ersten sechs Spalten \1 ersetzt.

+0

Danke Ich schätze Ihre Hilfe sehr, 'sed' erreicht, was ich will, sehr gut. – neo33

2

Mit GNU awk für 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 

Mit anderen awks es ist ein bisschen mehr Arbeit:

$ 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 

oder weil Sie eine Zeichenfolge haben FS eher als ein regexp:

$ 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 
+1

vielen Dank für die Unterstützung. – neo33

Verwandte Themen