2016-04-13 14 views
0

Wie verwende ich eine Bash for-Schleife, um eine Zahl an jeden Eintrag anzuhängen? Was ich versucht war die folgende:Ordnen Sie jeder Zeile in bash eine Zahl zu

for var in $(cat tmp), i in {1..7}; do echo $var:$i >> days_of_week; done 

Monday 
Tuesday 
Wednesday 
Thursday 
Friday 
Saturday 
Sunday 

Ich suche für diese Ausgabe hier:

Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 

Antwort

1

ich die Zeilen mit cat -n Zahl würde dann die Ausgabe mit sed umformatieren:

cat -n tmp | sed -r 's/([0-9]+)\s(.*)/\2:\1/' 
+1

Können Sie ein bisschen hoch levelof geben, was zu tun ist? Was ist der Unterschied zwischen '/' und '\' in diesem Befehl? was ist 's? –

+0

Es kann ein bisschen viel abhängig von Ihrer Kenntnis der regulären Ausdrücke im Allgemeinen und sed im Besonderen sein. Ich kann Ihnen zumindest eine globale Ansicht geben, sagen Sie mir, ob Sie mehr Informationen in einer bestimmten Richtung haben wollen: Ich benutze sed, um einen 's'substitution-Befehl auszuführen, von dem ein Format' s/pattern/replacement/'ist. Hier passe ich eine Nummer am Anfang einer Zeile in einer Gruppe an, dann den Rest der Zeile in einer anderen; Dies entspricht dem Format "cat -n". Schließlich verwende ich im Ersatzmuster Rückverweise, um diese Gruppen zu invertieren und sie mit einem ":" zu verbinden. – Aaron

3

In Bash:

n=0 
while IFS= read -r day; do 
    printf "%s:%d\n" "$day" $((++n)) 
done < days_of_week 

Dies liest die Namen aus der Datei und hängt einen Zähler nach dem Inkrementieren an (der $((++n)) Teil).

Or awk:

$ awk '{print $0 ":" NR}' days_of_week 
Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 

$0 ist die komplette Aufzeichnung (Zeile in diesem Fall), ist die NR die "Datensatznummer", die in diesem Fall die gleiche wie die Zeilennummer ist.

+0

In awk Befehl warum $ 0 und was ist NR? Woher weiß es, um 1 zu beginnen und um 7 zu beenden? –

+0

@power_output Ich habe eine kleine Erklärung hinzugefügt. –

+0

Für die while-Schleife - die IFS, -r und printf werden nicht benötigt. Es ist viel einfacher ohne sie und mit echo. – SaintHax

0

Es ist ein ziemlich einfaches, nur einen Zähler inkrementieren. Initialisiere den Zähler, lies jede Zeile und hefte den Zähler an, bevor du ihn inkrementierst.

i=1; while read day; do 
    echo $day:$i 
    ((i++)) 
done <tmp >>days_of_week 

, wenn Sie wirklich auf eine

for-Schleife gesetzt
i=1; for day in $(cat tmp); do 
    echo $day:$i 
    ((i++)) 
done >>days_of_week 
0
$ awk '{print $0 ":" NR}' <<EOF> days_of_week 
> Monday 
> Tuesday 
> Wednesday 
> Thursday 
> Friday 
> Saturday 
> Sunday 
> EOF 
$ cat days_of_week 
Monday:1 
Tuesday:2 
Wednesday:3 
Thursday:4 
Friday:5 
Saturday:6 
Sunday:7 
Verwandte Themen