2016-03-29 6 views
0

Ich habe ein Problem, bei dem ein Benutzer die Datei, Spalte, Wert und ID der Zeile gibt. Ich versuche, den Wert der Linieeine Datei in einer bestimmten Spalte einer geteilten Datei Bash Shell bearbeiten

Das Format der Datei zu ändern ist:

F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8

Mein Gedanke Dazu liest man die Datei und legt die Werte jedes Feldes in ein Array. Dann wird finde ich die Linie Ich möchte bei Verwendung ändern, und ich awk

while IFS=$'|t' read -r -a myArray 
do 
if [ $4 == ${myArray[0]} ]; then 
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}" 
    awk -v column="$5" -v value="$6"-F '{ ${myArray[column]} = value }' 
    echo "${myArray[1]} ${myArray[2]} ${myArray[4]}" 
    echo "${column} ${value}" 
fi 
done < $2 

jedoch verwenden, wenn ich tun, dass sich nichts verändert: die Spalten- und Wertargumente drucken nichts.
Irgendwelche Ideen?

+1

Jedes Mal, wenn Sie eine Schleife in der Shell nur schreiben Um Text zu manipulieren, haben Sie den falschen Ansatz. Lesen Sie http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice für mehr Hintergrund und lesen Sie das Buch Effective Awk Programming, 4th Edition, von Arnold Robbins, um zu lernen, wie man es richtig macht. –

Antwort

0

Sie haben nicht zu viele Informationen gegeben. Angenommen, Sie bestimmte Spalte ändern möchten, die field2 ist F2 Sie als unten tun können:

  1. $2=="F2" prüft Feld 2 wird Ihre spezifischen String-Matching.
  2. $2="Hello" zuweist "Hallo" 2 Feld
  3. $1=$1 neu zuweisen den gesamten Datensatz (Zeile)
  4. print Ausdruck der gesamte Datensatz

awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}' sample.csv

meinem Beispiel sehen:

$cat sample.csv                      
F1|F2|F3|F4|F5|F6|F7|F8 

$awk -F"|" 'BEGIN{OFS="|"} ($2=="F2"){$2="Hello";$1=$1; print}' sample.csv       
F1|Hello|F3|F4|F5|F6|F7|F8 
+1

hier $ 1 = $ 1 ist redundant. Sie weisen bereits $ 2 zu. – karakfa

Verwandte Themen