保存bash文件的输出

时间:2013-05-24 22:56:03

标签: linux bash shell

我在文件夹中有一些文件,我需要每个文件夹的第一行

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 个答案:

答案 0 :(得分:3)

在bash中:

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

正如Adam在评论中提到的那样,每次循环都会打开文件。如果您需要更好的性能和可靠性,请使用以下命令:

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

答案 1 :(得分: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;但是,这当然会通过解压缩来改变文件的位置,这可能是不受欢迎的。)

答案 2 :(得分:1)

这个awk单行应该做你想做的事:

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

每个csv的第一行将保存到文件中:output

答案 3 :(得分:0)

使用sed

for f in *.csv; do sed -n "1p" "$f"; done >salida