想要从文件名中的所有文件中打印前2行。 所有都是.csv扩展名文件。在该目录中有大约100个文件。
sample_jan.csv
10,Jan,100
30,Jan,300
50,Jan,500
sample_feb.csv
10,Feb,200
20,Feb,400
40,Feb,800
60,Feb,1200
预期产出:
Filename:sample_jan.csv
10,Jan,100
30,Jan,300
Filename:sample_feb.csv
10,Feb,200
20,Feb,400
尝试为下面的单个文件列出2行,但不知道如何循环播放所有文件。
cat sample_jan.csv | head -2 >>output.csv
cat sample_feb.csv | head -2 >>output.csv
cat *.csv | head -2 >output.csv
寻找你的建议,没有perl&蟒。
答案 0 :(得分:2)
使用awk
:
$ awk 'FNR==1{print "Filename:" FILENAME}FNR<3' *.csv
Filename:sample_jan.csv
10,Jan,100
30,Jan,300
Filename:sample_feb.csv
10,Feb,200
20,Feb,400
或强>
如果你有GNU awk并且你的文件非常大,那么这可能是一个选项:
$ gawk 'FNR==1{print "Filename:" FILENAME}FNR>2{nextfile}1' *.csv
Filename:sample_jan.csv
10,Jan,100
30,Jan,300
Filename:sample_feb.csv
10,Feb,200
20,Feb,400
答案 1 :(得分:1)
在awk中:
awk '
FNR == 1 {if(NR!=1)print""; printf("Filename:%s\n", FILENAME)}
FNR < 3
' *.csv
<强>解释强>
回想一下:
脚本:
FNR == 1 { # If it's the first record of the current file then:
if (NR != 1) # If it's NOT the first record of all files
print ""; # then print an empty line
printf("Filename:%s\n", FILENAME) # Print the filename
}
# If record number of current file is < 3 then
# perform default action (print the record).
FNR < 3
如果您在命令行上放置了太多文件(在*.csv
扩展后),那么您可以尝试这样做:
find -name '*.csv' -execdir awk '
FNR == 1 {
file = FILENAME
sub(/^\.\//, "", file)
printf("\nFilename:%s\n", file)
}
FNR < 3
' '{}' +
上面的find命令将执行awk,其中包含适合命令行的文件名列表('{}' +
替换为此列表),根据需要多次运行awk,但最小数量为次。
awk脚本中的替换在打印前从文件名前面剥离./
。
答案 2 :(得分:0)
For file in *
do
echo "Filename:$file" >> output.csv
head -2 $file >> output.csv
echo
done
无需cat
并将文件传输到头部。它可以将文件名作为参数。
答案 3 :(得分:0)
您可以循环遍历目录中的所有.csv
文件:
for f in *.csv; do YOUR_COMMAND; done
这应该可以与您的命令结合使用:
for f in *.csv; do cat "$f" | head -2 >>output.csv ; done
(未经测试 - 只是为了这个想法)
答案 4 :(得分:0)
如果您不关心标签Filename:
,您可以:
head -n2 * > output.csv