在Linux中使用文件名和文件内容创建CSV文件

时间:2019-02-20 10:25:45

标签: linux text-processing

我有一个文件夹,其中包含超过40万个txt文件。

名称类似

deID.RESUL_12433287659.txt_234323456.txt
deID.RESUL_34534563649.txt_345353567.txt
deID.RESUL_44235345636.txt_537967875.txt
deID.RESUL_35234663456.txt_423452545.txt

每个文件具有不同的内容

我想获取文件名和文件内容并以CSV格式保存。

类似的东西:

file_name,file_content
deID.RESUL_12433287659.txt_234323456.txt,Content 1
deID.RESUL_34534563649.txt_345353567.txt,Content 2
deID.RESUL_44235345636.txt_537967875.txt,Content 3
deID.RESUL_35234663456.txt_423452545.txt,Content 4

我知道如何使用以下方法来抓取CSV目录中的所有文件:

find * > files.csv

我还如何获取文件内容?

1 个答案:

答案 0 :(得分:0)

    顾名思义,
  1. 1010是用逗号分隔的文件。您展示了一张桌子。
  2. csv有点奇怪,find *已经进行了递归扫描。 find足以包含所有find .(好吧,除非您考虑到一些奇怪的shell glob规则)。
  3. 我们需要遍历文件。同样,删除换行符也很好。

find *

将输出:

# create file for a MCVE
while IFS=' ' read -r file content; do echo "$content" > "$file"; done <<EOF
deID.RESUL_12433287659.txt_234323456.txt       Content 1
deID.RESUL_34534563649.txt_345353567.txt       Content 2
deID.RESUL_44235345636.txt_537967875.txt       Content 3
deID.RESUL_35234663456.txt_423452545.txt       Content 4
EOF

{ 
    # I'm using `|` as the separator for columns
    # output header names
    echo 'file_name|file_content';
    # this is the hearth of the script
    # find the files
    # for each file execute `sh -c 'printf "%s|%s\n" "$1" "$(<"$1")"' -- <filename>`
    # printf - nice printing
    # "$(<"$1")" - gets file content and also removes trailing empty newlines. Neat.
    find . -type f -name 'deID.*' -exec sh -c 'printf "%s|%s\n" "$1" "$(<"$1")"' -- {} \;
} |
# nice formatting:
column -t -s'|' -o '      '