예: Unix 디렉터리에 50개의 파일이 있고 모든 파일의 헤더를 추출하여 CSV 파일에 쓰고 싶습니다. CSV 파일에는 2개의 열이 포함됩니다. 첫 번째 열은 파일 이름이고 두 번째 열은 제목입니다.
답변1
사용 head
및암소 비슷한 일종의 영양 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를 생성하는 경우 Excel이 \n
필드 내에서 레코드 끝을 구분할 수 있도록 ORS를 간단히 변경할 수 있습니다 \r\n
.
awk -v ORS='\r\n' 'FNR==1 {
gsub(/"/,"\"\"",FILENAME)
gsub(/"/,"\"\"")
printf "\"%s\",\"%s\"\n", FILENAME, $0
}' *
GNU awk가 있는 경우 효율성을 위해 ; nextfile
나중에 추가하세요 $0
.