我在文件夹中有一些文件,我需要每个文件夹的第一行
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
它不起作用=(
答案 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