【问题标题】:How to extract first few lines from a csv file inside a tar file without extracting it in linux?如何从tar文件中的csv文件中提取前几行而不在linux中提取它?
【发布时间】:2013-09-27 19:04:07
【问题描述】:

我有一个 tar 文件,里面有很多 csv 文件。 如何在不解压的情况下获取每个csv文件的前几行?

我试过了:

$(tar -Oxf $tarfile $file | head -n "$NL") >> cdn.log

但出现错误提示:

time(http:index: command not found

这是其中一个 csv 文件中的某一行。所有 csv 文件都报告了类似的错误... 有什么想法吗??

【问题讨论】:

  • 没错,您正在尝试评估文件的前几行。删除 $()。
  • 要详细说明@keltar 所说的内容,请说tar -Oxf $tarfile $file | head -n "$NL" >> cdn.log
  • 太棒了......它工作......非常感谢@keltar

标签: linux shell csv tar


【解决方案1】:

使用-O,您可以告诉 tar 将文件提取到标准输出而不是文件。因此,您应该能够首先使用tar tf <YOUR_FILE> 列出存档中的文件并使用grep 对其进行过滤以查找CSV 文件,然后对于每个文件使用tar xf <YOUR_FILE> <NAME_OF_CSV> -O | head 将文件的开头获取到标准输出。这可能有点无效,因为您解压缩档案的数量与 CSV 文件的数量一样多,但应该可以。

【讨论】:

  • 我试过这个。 for file in $(tar -tf "$tarfile") do cdn.log=$(tar -Oxf $tarfile $file | head -n "$NL") done 其中 NL 是行数...但没有用
  • 我试过 $(tar -Oxf $tarfile $file | head -n "$NL") >> cdn.log 但是得到错误说... time(http:index: command not found " time(http:index:" 这是 csv 文件中的某行.... 有什么想法吗??
  • 不可能如你所说。请发布您的完整脚本。看看另一个你的问题,只是略有不同 - 我有一种感觉你做错了什么。
  • 我的完整脚本:#!/bin/bash cd /root/Chithra/ProbeLogs/CDN PER=10 for tarfile in ls *.tar do for file in $(tar -tf "$tarfile") do #file=echo ${file##*/} echo CSV 文件:$file NL=$(tar -Oxf $tarfile $file | wc -l) echo $NL mul=expr $NL \* $PER NL=expr $mul / 100 echo $NL $(tar -Oxf $tarfile $file | head -n "$NL")>> cdn.log 完成了
  • @user1407668 如果 NL 是整个文件的行数,为什么你只读取 NL 行?这没有意义。使用不带参数的cat(与您的问题无关 - 只是不那么神秘)。至于您的最新问题-您在评论中有问题的答案。 $() 表示法(和重音,不知道如何在 stackoverflow 上键入这个符号..)表示“获取命令的输出” - 在for 列表中你需要这个,但在最后一个命令中你只是试图执行存储的操作在文件中并将结果输出重定向到文件 - 但它显然不是 shell 命令(也不是你想要做的,无论如何)。
【解决方案2】:

您可以使用 及其Archive::Tar 模块。这是一个提取每行的前两行的单行:

perl -MArchive::Tar -E '
    for (Archive::Tar->new(shift)->get_files) { 
        say (join qq|\n|, (split /\n/, $_->get_content, 3)[0..1]) 
    }
' file.tar

假设tar 文件只有文本文件,它们是csv。否则你将不得不grep 来过滤你想要的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多