öffnen So lesen Sie eine Datei von Zeile x bis zum Ende einer Datei in Bash




raspberry pi datei öffnen (6)

Dafür gibt es viele Lösungen. Einer meiner Favoriten ist:

(head -2 > /dev/null; whatever_you_want_to_do) < file.txt

Sie können auch tail , um die gewünschten Zeilen zu überspringen:

tail -n +2 file.txt | whatever_you_want_to_do

Ich würde gerne wissen, wie ich jede Zeile einer csv Datei von der zweiten Zeile bis zum Dateiende in einem Bash-Skript lesen kann.

Ich kann eine Datei in Bash lesen:

while read line
 do   
   echo -e "$line\n"
done < file.csv

Aber ich möchte die Datei von der zweiten Zeile bis zum Ende der Datei lesen. Wie kann ich das erreichen?


tail -n +2 file.csv

Aus der Manpage :

-n, --lines=N
     output the last N lines, instead of the last 10
...

If the first character of N (the number of bytes or lines)  is  a  '+',
print  beginning with the Nth item from the start of each file, other-
wise, print the last N items in the file.

In englischer Sprache bedeutet dies:

tail -n 100 die letzten 100 Zeilen aus

tail -n +100 druckt alle Zeilen ab Zeile 100


Ich würde nur eine Variable bekommen.

#!/bin/bash

i=0
while read line
do
    if [ $i != 0 ]; then
      echo -e $line
    fi
    i=$i+1
done < "file.csv"

UPDATE Above sucht in jeder Zeile der csv-Datei nach der $i -Variable. Wenn Sie also eine sehr große CSV-Datei mit Millionen Zeilen haben, wird dies erhebliche Mengen an CPU-Zyklen kosten, was für Mutter Natur nicht gut ist .

Im Anschluss an einen Liner kann die erste Zeile der CSV-Datei mithilfe von sed gelöscht und die verbleibende Datei dann in while Schleife ausgegeben werden.

sed 1d file.csv | while read d; do echo $d; done

Das wird funktionieren

i=1
while read line
 do   
   test $i -eq 1 && ((i=i+1)) && continue
   echo -e "$line\n"
done < file.csv

Einfache Lösung mit sed :

sed -n '2,$p' <thefile

Dabei ist 2 die Nummer der Zeile, aus der Sie lesen möchten.


Oder auch ( pure bash ) ...

{ for ((i=1;i--;));do read;done;while read line;do echo $line;done } < file.csv

Besser geschrieben:

linesToSkip=1
{
    for ((i=$linesToSkip;i--;)) ;do
        read
        done
    while read line ;do
        echo $line
        done
} < file.csv

Dies funktioniert auch, wenn linesToSkip == 0 oder linesToSkip> file.csv die Anzahl der Zeilen

Bearbeiten :

Changed () für {} as gniourf_gniourf fordert mich auf zu überlegen: Zuerst erzeugen Sie eine Sub-Shell mit Syntax, whille {} nicht.

Um nur eine Zeile zu überspringen (als Titel der ursprünglichen Frage), kann die Schleife for (i=1;i--;));do read;done kann einfach durch read ersetzt werden:

{ read;while read line;do echo $line;done } < file.csv




bash