要打印FileName和选定的行:

时间:2014-06-19 15:08:09

标签: unix awk

想要从文件名中的所有文件中打印前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&蟒。

5 个答案:

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

<强>解释

回想一下:

  • 记录默认为行
  • NR计算从1开始的记录,并且不会在文件之间重置
  • FNR统计从1开始的记录,并将每个文件重置为1。

脚本:

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