GNU/Linux >> Linux Esercitazione >  >> Linux

Ciclo del contenuto di un file in Bash

cat peptides.txt | while read line 
do
   # do something with $line here
done

e la variante a una riga:

cat peptides.txt | while read line; do something_with_$line_here; done

Queste opzioni salteranno l'ultima riga del file se non c'è avanzamento riga finale.

Puoi evitarlo procedendo come segue:

cat peptides.txt | while read line || [[ -n $line ]];
do
   # do something with $line here
done

Opzione 1a: Ciclo while:una riga alla volta:reindirizzamento dell'input

#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do 
    echo "$p"
done < "$filename"

Opzione 1b: Ciclo while:riga singola alla volta:
Apri il file, leggi da un descrittore di file (in questo caso il descrittore di file n. 4).

#!/bin/bash
filename='peptides.txt'
exec 4<"$filename"
echo Start
while read -u4 p ; do
    echo "$p"
done

Questo non è migliore di altre risposte, ma è un altro modo per portare a termine il lavoro in un file senza spazi (vedi commenti). Trovo che spesso ho bisogno di una riga per scavare negli elenchi nei file di testo senza il passaggio aggiuntivo di utilizzare file di script separati.

for word in $(cat peptides.txt); do echo $word; done

Questo formato mi consente di inserire tutto in una riga di comando. Cambia la parte "echo $word" in quello che vuoi e puoi emettere più comandi separati da punto e virgola. L'esempio seguente utilizza i contenuti del file come argomenti in altri due script che potresti aver scritto.

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done

Oppure, se intendi usarlo come un editor di stream (impara sed), puoi scaricare l'output in un altro file come segue.

for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt

Li ho usati come scritto sopra perché ho usato file di testo dove li ho creati con una parola per riga. (Vedi commenti) Se hai spazi che non vuoi dividere le tue parole/righe, diventa un po' più brutto, ma lo stesso comando funziona ancora come segue:

OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS

Questo dice semplicemente alla shell di dividersi solo su nuove righe, non su spazi, quindi riporta l'ambiente a quello che era in precedenza. A questo punto, però, potresti prendere in considerazione l'idea di inserire tutto in uno script di shell piuttosto che comprimerlo tutto in una singola riga.

In bocca al lupo!


Un modo per farlo è:

while read p; do
  echo "$p"
done <peptides.txt

Come sottolineato nei commenti, questo ha gli effetti collaterali di tagliare gli spazi bianchi iniziali, interpretare le sequenze di barre rovesciate e saltare l'ultima riga se manca un avanzamento riga di chiusura. Se queste sono preoccupazioni, puoi fare:

while IFS="" read -r p || [ -n "$p" ]
do
  printf '%s\n' "$p"
done < peptides.txt

Eccezionalmente, se il corpo del ciclo può leggere dall'input standard, puoi aprire il file utilizzando un descrittore di file diverso:

while read -u 10 p; do
  ...
done 10<peptides.txt

Qui, 10 è solo un numero arbitrario (diverso da 0, 1, 2).


Linux
  1. Scorrere i file con spazi nei nomi??

  2. Bash:aggiunge una stringa alla fine del file senza interruzioni di riga

  3. Come verificare se un file è vuoto in Bash?

  4. Come ottengo la directory assoluta di un file in bash?

  5. Come si esegue il gunzip di un file e si conserva il file .gz?

Reindirizzamento del contenuto di un file al comando "eco"?

Il Bash '?

Rinomina di massa del file Bash con contatore?

Script Bash per rimuovere il file più vecchio da una cartella?

Come visualizzare il contenuto di un backup del file di database Dconf?

5 comandi per visualizzare il contenuto di un file nella riga di comando di Linux