Come posso creare un array dalla prima riga di più fonti di testo?


8

Ho una serie di percorsi per i file che hanno ciascuno diverse righe di testo. Vorrei produrre un array popolato con la prima riga di ogni file elaborato in questo modo:

# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
  ./this/path/this.txt
  ./another/path/another.txt
)

for i in ${paths[@]}; do
  read -r line < $i
  lines+=$line
done

Al massimo ho ottenuto un solo valore nel mio array. Non riesco a ottenere l'array che sto cercando fuori dal ciclo for. Ho provato molte varianti e ho difficoltà a capire dove sbaglio.

Risposte:


11

Volevi

lines+=("$line")

+=WORD è la concatenazione di stringhe (o aggiunta). Un Assegnazione composta +=(...) aggiunge i valori alla matrice.

Probabilmente vuoi anche citare tutte le tue espansioni variabili qui - ne ha linesicuramente bisogno se la linea potrebbe contenere spazi bianchi, ma potresti avere problemi anche altrove.


Grazie, ora ha senso perché in alcuni dei miei tentativi sembrava che il risultato fosse un mix delle due linee.
Dimmech

4

In Bash puoi anche leggere direttamente le righe in un array. Se si seleziona la lunghezza dell'array corrente ${#lines[@]}come indice di inserimento, è possibile aggiungere ad esso:

for i in "${paths[@]}"; do
    mapfile -t -n 1 -O ${#lines[@]} lines < "$i"
done

Estratto di sinossi

mapfile mapfile [-n count] [-O origin] [-t] [array]

Leggi le righe dallo standard input nell'array delle variabili di array indicizzato […]. Le opzioni, se fornite, hanno i seguenti significati:

  • -n: Copia al massimo le righe di conteggio . Se il conteggio è 0, tutte le righe vengono copiate.

  • -O: Inizia ad assegnare l' array all'origine dell'indice . L'indice predefinito è 0.

  • -t: Rimuove una nuova riga finale da ogni riga letta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.