1

フォルダーにいくつかのファイルがあり、各フォルダーの最初の行が必要です

transaction1.csv
transaction2.csv
transaction3.csv
transaction4.csv

そして私は次のコードを持っています

#All folders that begin with the word transaction

folder='"transaction*"'

ls `echo $folder |sed s/"\""/\/g` >testFiles

# The number of lines of testFiles that is the number of transaction files

num=`cat testFiles | wc -l`

for i in `seq 1 $num`
do
    #The first transaction file
    b=`cat testFiles | head -1`

    #The first line of the first transaction file
    cat `echo $b` | sed -n 1p 

    #remove the first line of the testFiles
    sed -i '1d' testFiles 
done

このコードは機能します。問題は、各ファイルの最初の行をファイルに保存する必要があることです

行を変更した場合:

cat `echo $b` | sed -n 1p > salida

動作しません =(

4

4 に答える 4

3

バッシュの場合:

for file in *.csv; do head -1 "$file" >> salida; done

Adam がコメントで述べたように、これにはループのたびにファイルを開くというオーバーヘッドがあります。より良いパフォーマンスと信頼性が必要な場合は、次を使用します。

for file in *.csv; do head -1 "$file" ; done > salida
于 2013-05-24T23:14:46.743 に答える
2
head -qn1 *.csv

head -n1-qコマンドラインで複数のファイルが指定された場合、各ファイルの最初の行を出力し、ヘッダーを抑制します。

=== 編集 ===

ファイルが生のテキストではなく (たとえば、コメントで言及されているように「bzip2」で圧縮されている場合)、各ファイルに対して重要な前処理を行う必要がある場合は、おそらくforループを使用することをお勧めします。例えば:

for f in *.csv.bz2 ; do
    bzcat "$f" | head -n1
done > salida

(別のオプションとしてbunzip2、ファイルを取得してから のheadように 2 段階で処理することもできますbunzip2 *.csv.bz2 && head -qn1 *.csv > salida。ただし、これはもちろんファイルを展開することでその場でファイルを変更することになりますが、これはおそらく望ましくありません。)

于 2013-05-25T00:10:06.657 に答える
1

この awk ワンライナーは、あなたが望むことをするはずです:

awk 'FNR==1{print > "output"}' *.csv

それぞれの最初の行がcsvファイルに保存されます。output

于 2013-05-24T23:12:20.387 に答える
0

使用sed:

for f in *.csv; do sed -n "1p" "$f"; done >salida
于 2013-05-24T23:58:27.203 に答える