2016-04-19 10 views
2

mit habe ich eine Datei mit dem Namen file.txt mit folgenden WertenAnfügen Inhalt in eine Datei, falls nicht vorhanden comma separated values ​​

4 
5 
6 
7 

Ich habe einige comma separated values ​​auf die obige Datei übergeben.

Unten ist mein Befehl:

filename="file.txt" 

IFS="," 
var="4,5" 
for v in $var; do 
    while IFS= read -r line; do 
     if [[ $line == $v* ]]; then 
      printline="no" 
     else 
      printline="yes" 
      echo "$line" 
     fi 
    done < "$filename" 
done 

ich die obige Befehl wollen in eine neue Datei anzuhängen, wenn es nicht die Werte in der Datei vorhanden ist, dass ich von den Variablen übergeben. Zum Beispiel übergebe ich 4,5 in der Datei. Allerdings sollte es 6,7 drucken, da ich diese Werte nicht übergebe.

Gegenwärtig beginnt Schleifen mit Nummer 4 und Drucke 5,6,7. Wenn die Schleife jedoch erneut mit Nummer 5 beginnt, wird 4,6,6 gedruckt.

Der obige Befehl sollte das Ergebnis wie folgt erzeugen und sollte nicht zurückgeschleift werden und die Nummer erneut drucken.

6 
7 

Irgendwelche Möglichkeiten, dies zu erreichen? Oder können Sie mir eine andere Methode mit Beispielcode vorschlagen?

+0

Statt 'IFS = ""; var = "4,5"; für v in $ var; do ... 'do' IFS =, lies -ra vars <<< "$ var"; für v in "$ {vars [@]}"; tu ...; fertig. –

+0

Die Originaldatei hat eine Nummer pro Zeile? Oder möchten Sie alle Zeilen ignorieren, die * mit einer Ihrer bestandenen Nummern beginnen *? Für was ist 'printline'? Was passiert, wenn Sie diesen Code ausführen? Wenn Sie 'set -x' zum Skript hinzufügen und es ausführen, sehen Sie, warum das passiert? –

Antwort

0

folgende Lösungen testen ich die folgende Datei erstellt, entsprechend Ihrer Frage (datei.txt):

4 
5 
6 
7 

Sie ausführen können:

$ grep -v $'4\n5' file.txt 
6 
7 

Obwohl es scheint, dass Sie mehr Kontrolle haben möchten, so das folgende verwendet Ihre Datei ein s eine Eingabe, und das Argument "4,5" ist fest codiert (Sie können dies ändern). Es verwendet eine Associative Array, die in Bash 4 verfügbar:

#!/bin/bash 

# Usage: inarray "$value" "${array[@]}" 
inarray() { local n=$1 h; shift; for h; do [[ $n = "$h" ]] && return; done; return 1; } 
# The file which contains 4 5 6 7 separated by a new-line 
source_file=$1 
# Variables by you'd like to exclude. 
var="4,5" 
# Reading $var into an array 
IFS=, read -ra vars <<< "$var" 
# Reading $source_file values into an array. 
mapfile -t numbers < "$1" 
# An assoc array to hold the number which do not exist on $source_file 
declare -A arr 

for n in "${numbers[@]}"; do 
    # If the number does not exist in "${vars[@}}" 
    if ! inarray "$n" "${vars[@]}"; then 
     # Store that info on arr. 
     arr["$n"]=1 
    fi 
done 

printf '%s\n' "${!arr[@]}" 

Anwendungsbeispiel (Skriptname ist sof):

$ ./sof file.txt 
$ 6 
$ 7 
+0

Hallo Rany Albeg Wein Dank Ebenso haben wir ein anderes Setup, die eine Datei mit dem Namen parameters.txt hat, die in Comma Separated Value enthält: db.hostname, db.username, db.Password, db.URL, db.status Außerdem haben wir eine Hauptdatei namens properties.txt, die im Zeilenformat enthält db.hostname db.username db.password Ich muss die kommagetrennten Werte in parameter.txt übergeben und überprüfen, ob es in Eigenschaften vorhanden ist .txt. Wenn es nicht existiert, sollte es unten in der properties.txt drucken Zum Beispiel sollten db.url und db.status auf der unteren Seite von properties.txt drucken. Können Sie Beispielcode zur Verfügung stellen? – Rashid

+0

Ich werde mein Bestes versuchen. Öffnen Sie eine neue Frage mit spezifischen Details und genauer Wunschausgabe für dieses neue Szenario. –

+0

Hallo Rany Albeg Wein, Vor Ihrer Anfrage habe ich eine neue Frage http://stackoverflow.com/questions/36722365/appending-contents-to-a-file-if-doesnt-exist-using-comma-values ​​erstellt – Rashid

Verwandte Themen