例如:Unix目录中有50个文件,我想提取所有文件的标头并将其写入CSV文件。 CSV 文件将包含 2 列,第一列 - 文件名,第二列作为标题
答案1
使用head
和GNU 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
以提高效率。