2016-08-08 56 views
0

Ich habe 2 Variablen, i und j. Für jede Kombination der Variablen gibt es eine Textdatei, text.txt, mit Text in Leerzeichen getrennt angeordnet Spalten, zB:Bash extrahieren Zeilen aus Textdatei und fügen Sie zusätzliche Spalten mit der Variablen

string1 43245 7.45 
string2 23452 9.34 
string3 23652 2.57 

Ich möchte folgendes tun: eine große Textdatei Stellen enthält alle Textdateien mit den hinzugefügten Variablen in zusätzlichen Spalten und einigen anderen zusätzlichen Spalten, die Text und nicht aus Variablen enthalten. Zum Beispiel

i = x01 
j = y01 

Dann sollte der Ausgang sein:

x01 y01 extrastring string1 43245 7.45 
x01 y01 extrastring string2 23452 9.34 
x01 y01 extrastring string3 23652 2.57 

Ich habe versucht, so etwas wie:

awk '{$0="'"$i"' '"$j"' extrastring"$0}'1 $i/$j/text.txt >> newtext.txt 

Das funktioniert nicht.

Edit: Ich muss wohl hinzufügen, dass dies in einem doppelten for-Schleife laufen soll:

for i in x01 x02 x03 
do 
    for j in y01 y02 y03 
    do 
    awk '{$0="'"$i"' '"$j"' extrastring"$0}'1 $i/$j/text.txt >> newtext.txt 
    done 
done 

Edit: Ich habe versucht, dies basierend auf Sofan Antwort

for i in x01 x02 x03 
do 
    for j in y01 y02 y03 
    do 
    cd $i/$j/ 
    awk -v i="$i" -v j="$j" '{print i,j,"extrastring",$0}' text.txt >> newtext.txt 
    done 
done 

Leider es doesn‘ t arbeiten. Das Skript wird nicht ausgeführt.

+0

So ist 'test.txt' konstant und Sie wollen es mit verschiedenen Spalten für jedes Paar von x01 .. y01 .. drucken? – fedorqui

+0

Sorry, nein die Textdatei ist nicht konstant. Es gibt eine andere text.txt in jedem $ i/$ j/- Ordner, z.B. x01/y01/text.txt, x01/y02/text.txt, etc ... – Anders

Antwort

1
awk -v i="x01" -v j="y01" '{print i,j,"extrastring",$0}' text.txt 
x01 y01 extrastring string1 43245 7.45 
x01 y01 extrastring string2 23452 9.34 
x01 y01 extrastring string3 23652 2.57 

Oder wenn Sie bereits Variable deklariert haben:

i=x01 
j=y01 
awk -v i="$i" -v j="$j" '{print i,j,"extrastring",$0}' text.txt 
+0

Das sieht gut aus, aber es wird nicht funktionieren. Kann nicht herausfinden warum – Anders

0

Wie wäre es mit the read command zum Lesen der Dateien und Ausgabe mit echo?

So etwas wie

cat file.txt | while read line; do 
    echo "$i $j extrastring $line" 
done > newfile.txt 
+1

Katze nicht wirklich benötigt!?! –

0

Version 3:

for var1 in x01 x02 
do 
    for var2 in y01 y02 
    do 
     awk '{ print "'"$var1 $var2"'" " extrastring " $0}' $var1/$var2/text.txt 
    done 
done 
x01 y01 extrastring string1 43245 7.45 
x01 y01 extrastring string2 23452 9.34 
x01 y01 extrastring string3 23652 2.57 
x01 y02 extrastring string1 43245 7.45 
x01 y02 extrastring string2 23452 9.34 
x01 y02 extrastring string3 23652 2.57 
x02 y01 extrastring string1 43245 7.45 
x02 y01 extrastring string2 23452 9.34 
x02 y01 extrastring string3 23652 2.57 
x02 y02 extrastring string1 43245 7.45 
x02 y02 extrastring string2 23452 9.34 
x02 y02 extrastring string3 23652 2.57 

Hat es nicht unter Verzeichnisstruktur testen, obwohl.

0

versuchen Sie dies;

test.sh:

#!/bin/bash 
dataFile=$1 
varFile=$2 
line=$(awk -F = '{print $2}' $varFile | tr '\n' ' ') 
awk -v variables="${line}" '{print variables "extrastring " $0 }' $dataFile 


[email protected]:/tmp$ cat dataFile 
string1 43245 7.45 
string2 23452 9.34 
string3 23652 2.57 

[email protected]:/tmp$ cat varFile 
i = x01 
j = y01 

[email protected]:/tmp$ ./test.sh dataFile varFile 
x01 y01 extrastring string1 43245 7.45 
x01 y01 extrastring string2 23452 9.34 
x01 y01 extrastring string3 23652 2.57