用于提取目录中存在的多个文件的标头的命令

用于提取目录中存在的多个文件的标头的命令

例如:Unix目录中有50个文件,我想提取所有文件的标头并将其写入CSV文件。 CSV 文件将包含 2 列,第一列 - 文件名,第二列作为标题

答案1

使用headGNU sed

head -n 1 -v * | 
sed 'N;s/.* \(.*\) .*\n\(.*\)/\1,\2/p;D'

注意:-v仅当只有一个文件时才需要。

答案2

您无法从 bash 轻松创建 XLS 文件,但可以创建 CSV 文件并将其导入 Excel。

cd DIRECTORY
rm list-of-headers.csv 2>/dev/null
for f in *; do
    head=$(sed -n -e '1s/"/""/g' -e '1p;q' < "$f")
    file=$(sed 's/"/""/g' <<< "$f")
    printf '"%s","%s"\n' "$file" "$head" >> list-of-headers.csv
done > list-of-headers.csv

这将list-of-headers.csv在目录中创建一个名为的新文件,该文件由两个逗号分隔的列组成,其中包含文件名和标题行。

  • sed -n -e '1s/"/""/g' -e '1p;q'重复任何"(以遵守RFC 4180)在第一行中,打印它然后退出(因此sed不需要读取文件中的所有其他行)
  • printf ...将该行附加到目标 CSV

答案3

听起来这可能就是您想要的:

awk -v OFS=, 'FNR==1{print FILENAME, $0}' *

或者如果您的 CSV 要求引用其字段(例如,如果您的文件名或标题行可以包含逗号):

awk 'FNR==1{printf "\"%s\",\"%s\"\n", FILENAME, $0}' *

YMMV 如果您的文件名或第一行包含双引号或换行符(在文件名的情况下)。您可以执行此操作或类似操作来转义任何双引号:

awk 'FNR==1 {
    gsub(/"/,"\"\"",FILENAME)
    gsub(/"/,"\"\"")
    printf "\"%s\",\"%s\"\n", FILENAME, $0
}' *

如果您的文件名可以包含换行符并且您正在生成要导入 Excel 的 CSV,那么您只需更改 ORS,以便 Excel 可以\n在字段内与\r\n记录末尾分隔:

awk -v ORS='\r\n' 'FNR==1 {
    gsub(/"/,"\"\"",FILENAME)
    gsub(/"/,"\"\"")
    printf "\"%s\",\"%s\"\n", FILENAME, $0
}' *

如果您有 GNU awk,请; nextfile在后面添加$0以提高效率。

相关内容