57

csvbash スクリプトで 2 行目からファイルの最後までファイルの各行を読み取る方法を知りたいです。

bashでファイルを読み取る方法を知っています:

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

でも、2行目からファイルの最後まで読み込みたい。どうすればこれを達成できますか?

4

7 に答える 7

73
tail -n +2 file.csv

マニュアルページから:

-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.

英語では、これは次のことを意味します。

tail -n 100最後の 100 行を出力します

tail -n +100100行目から始まるすべての行を印刷します

于 2013-01-01T12:09:43.827 に答える
19

以下の単純なソリューションsed:

sed -n '2,$p' <thefile

どこ2から読みたい行の番号です。

于 2013-01-01T12:00:54.637 に答える
11

または(純粋なbash)...

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

より良い書き方:

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

これは、linesToSkip == 0 または linesToSkip > file.csv の行数の場合でも機能します

編集

gniourf_gniourf が検討するように私に命じたように変更されました: 最初の構文は sub-shell を生成しますが、()そうはありません。{}{}

もちろん、(元の質問のタイトルとして)1行だけスキップするには、ループを次のfor (i=1;i--;));do read;doneように単純に置き換えることができますread

{ read;while read line;do echo $line;done } < file.csv
于 2013-01-01T12:37:48.987 に答える
7

行で何をしたいかにもよりますが、選択した各行を配列に保存したい場合、最良の選択は間違いなくビルトインmapfileです:

numberoflinestoskip=1
mapfile -s $numberoflinestoskip -t linesarray < file

は、2 行目から始まるファイルの各行をfile配列に格納しlinesarrayます。

help mapfile詳細については。

各行を配列に格納したくない場合は、他の非常に良い答えがあります。

F. Hauri がコメントで示唆しているように、これはファイル全体をメモリに保存する必要がある場合にのみ適用されます。

それ以外の場合、最善の策は次のとおりです。

{
    read; # Just a scratch read to get rid (pun!) of the first line
    while read line; do
        echo "$line"
    done
} < file.csv

注意: サブシェルは必要ありません。

于 2013-01-01T12:43:21.730 に答える
7

これには多くの解決策があります。私のお気に入りの1つは次のとおりです。

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

tail必要な行をスキップするために使用することもできます:

tail -n +2 file.txt | whatever_you_want_to_do
于 2013-01-01T12:07:21.937 に答える
3

これはうまくいきます

i=1
while read line
 do   
   test $i -eq 1 && ((i=i+1)) && continue
   echo -e "$line\n"
done < file.csv
于 2015-03-07T00:50:33.540 に答える
1

変数を取得するだけです。

#!/bin/bash

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

UPDATE$i上記は、csvのすべての行で変数をチェックします。したがって、数百万行の非常に大きな csv ファイルがある場合、かなりの量の CPU サイクルが消費され、母なる自然には適していません

次の 1 つのライナーを使用して、CSV ファイルの最初の行を削除しsed、残りのファイルをwhileループに出力できます。

sed 1d file.csv | while read d; do echo $d; done
于 2013-01-01T12:17:47.787 に答える