2016-04-14 7 views
0

Ich möchte die erste Spalte drucken, dann ein paar Spalten mit festen Werten, wie dieser Befehl tun würde:awk: print ersten Spalte, dann einige Werte, und dann alle anderen Spalten

awk '{print $1,"1","2","1"}' 

und dann drucken Sie alle Spalten mit Ausnahme der ersten danach ... ich kenne diesen Befehl druckt alle, aber die erste Spalte:

awk '{$1=""; print $0}' 

aber das wird von der ersten Spalte befreien.

Mit anderen Worten, dies:

3 5 2 2 
3 5 2 2 
3 5 2 2 
3 5 2 2 

braucht dies zu werden:

Irgendwelche Ideen
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 

?

Antwort

2

eine Schleife durch restliche Spalten so iterieren:

awk '{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}'

Als Beispiel:

$echo "3 5 2 2" | awk 'BEGIN{ORS=""}{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}' 
3 1 2 1 5 2 2 
$ 

Edit1:

$ echo "3 5 2 2" | awk 'BEGIN{ORS="\n";OFS="\n"}{print $1,"1","2","1 ";for(i=2;i<=NF;i++) print $i" "}' 
3 
1 
2 
1 
5 
2 
2 
$ 

EDIT2:

$ echo "3 5 2 2" | awk '{print $1,"1","2","1";for(i=2;i<=NF;i++) print $i}' 
3 1 2 1 
5 
2 
2 
$ 

Edit3:

$ echo "3 5 2 2 
3 5 2 2 
3 5 2 2 
3 5 2 2" | awk '{printf("%s %s ", $1,"1 2 1");for(i=2;i<=NF;i++) printf("%s ", $i); printf "\n"}' 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
+0

Danke! Das funktioniert fast, außer es scheint alles in 1 Zeile zu drucken ...(Wenn Sie in Ihrem Beispielbefehl mehrere Zeilen erstellen, druckt er alle Zeilen in der ersten Zeile) – Abdel

+0

dafür können Sie 'ORS =" \ n "' und 'OFS =" \ n "' – ritesht93

+0

verwenden Werte in einer neuen Zeile ... Wenn Ihre Originaldatei aus "3 5 2 2" besteht, aber in vier Zeilen, können Sie damit arbeiten? (dh, erstellen Sie eine neue Datei mit "3 1 2 1 5 2 2" in vier Zeilen) – Abdel

1

Sie können dies mit tun sed durch den ersten Raum ersetzt durch die Zeichenfolge, die Sie wollen.

sed 's//1 2 1 /' file 

(OR)

Mit awk durch das erste Feld zu ersetzen ($1):

awk '{$1=$1 " 1 2 1"}1' file 

(Ich ziehe die sed Lösung, da sie weniger Zeichen hat).

1

Sie sind fast da, man muss nur die erste Spalte in einer temporären Variablen speichern:

{ 
    head=$1; # Store $1 in head, used later in printf 
    $1=""; # Empty $1, so that $0 will not contain first column 
    printf "%s 1 2 1%s\n", head, $0 
} 

und ein komplettes Skript:

echo "3 5 2 2" | awk '{head=$1;$1="";printf "%s 1 2 1%s\n", head, $0}' 
1

Eine andere Lösung mit awk:

awk '{sub(/.*/, "1 2 1 "$2, $2)}1' File 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 
3 1 2 1 5 2 2 

Das zweite Feld durch "1 2 1" und dann das zweite Feld selbst ersetzen.

Verwandte Themen