【问题标题】:Remove lines from head and tail of multiple text files and merge从多个文本文件的头部和尾部删除行并合并
【发布时间】:2014-01-14 22:07:01
【问题描述】:

我有多个具有不同数据的文本文件,但标题和底部文本相同。我必须删除标题和尾部文本并将它们合并到一个输出文件中。任何一艘速度不错的班轮都会很好。所有文件名都以名称ABC开头,并且在同一个目录中。

示例文件1:

This is a sample header
This is Not required
I have to remove this data

....... DATA of file 1 .........

This is sample tail 
It needs to be removed

示例文件2:

This is a sample header
This is Not required
I have to remove this data

....... DATA of file 2 .........

This is sample tail 
It needs to be removed

我正在使用

head -n -12 ABC.txt | tail -n +20 > output.txt 

但它只处理 1 个文件。 (从底部移除 12 行,从顶部移除 20 行)

【问题讨论】:

  • 您显示的空白行是包含还是排除?数据是否包含空行?文件尾部开始的模式是否易于识别?它会出现在文件的数据部分吗?
  • 不,它们不包括在内。您可以编写一个示例命令行,我可以根据需要调整,省略多少。
  • 很抱歉,但您应该表明您已尝试自行解决问题。考虑编辑您的问题,以包括您解决问题的最佳尝试。祝你好运。
  • 我正在使用“head -n -12 ABC.txt | tail -n +20 > output.txt” .. 但它只处理 1 个文件。 (从底部移除 12 行,从顶部移除 20 行)

标签: unix merge head tail cat


【解决方案1】:

假设所有文件都有一个 20 行的页眉和 12 行的页脚,您可以使用 sed 提取第 21 行到第 13 行到最后一行:

for file in ABC*; do
    numlines=$(cat $file | wc -l)
    lastline=$(( $numlines - 12 ))
    (( 21 <= $lastline )) && sed "21,$lastline \!D" $file >> combined.txt
done

只有页眉和页脚但没有附加行的文件不会产生任何输出。 如果您更喜欢使用headtail 命令而不是sed

for file in ABC*; do
    numlines=$(cat $file | wc -l)
    (( 32 < $numlines )) && head -n -12 $file | tail -n +20 >> combined.txt
done

【讨论】:

    【解决方案2】:

    使用 ABC* 而不是 ABC.txt。如果您使用 ABC.txt,它将只处理该文件。如果您使用 ABC*,它将处理所有以 ABC 开头的文件。

    【讨论】:

    • 我已经做了,它只是处理了第一个文件的头部和最后一个文件的尾部。我不想要的所有其他标题/尾部都在最后一个组合文件中。
    猜你喜欢
    • 2013-05-28
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    相关资源
    最近更新 更多