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

在 bash 中:

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

正如亚当在评论中提到的那样,每次通过循环打开文件都会产生开销。如果您需要更好的性能和可靠性,请使用以下内容:

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分两步进行,例如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 回答