【问题标题】:Script/command to merge 3 files retaining last file name用于合并保留最后一个文件名的 3 个文件的脚本/命令
【发布时间】:2018-04-24 18:52:41
【问题描述】:

我有多个文件(头文件、尾文件和数据文件)需要合并为一个保留文件名的文件。

输入文件

WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_1.TXT (Header file)
WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_2.TXT  (data file)
WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_3.TXT  (trailer file)

WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_1.TXT (Header file)
WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_2.TXT  (data file)
WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_3.TXT  (trailer file)

输出文件应该有来自文件的相同顺序的数据,文件名应该是这样的。

WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7.TXT
WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3.TXT

需要快速帮助来实现这一目标。

提前致谢。

【问题讨论】:

  • 所以你的意思是创建一个shell脚本?你走了多远?在您的问题中包含您的脚本。
  • 这将是cat的有用用法
  • 我试过这个 ls | awk -F '_' '!x[$1]++{print $1}' |虽然 read -r line do cat $line >> $line\.txt 完成它会创建具有正确数据的临时文件,但我需要如上所述重命名文件名并删除现有文件。只保留最终文件。
  • 编辑您的问题并包含您的示例代码(即,将评论块移至问题)

标签: shell unix merge rename ksh


【解决方案1】:

假设所有文件名都是您的问题中显示的格式(即,9 个字段由单个下划线分隔)...

一些示例数据:

$ for f in WP*_?_?.TXT
do
    echo "+++++++ $f"
    cat $f
    echo ""
done

+++++++ WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_1.TXT
2024916 header

+++++++ WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_2.TXT
2024916 data

+++++++ WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3_3.TXT
2024916 trailer

+++++++ WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_1.TXT
2024078 header

+++++++ WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_2.TXT
2024078 data

+++++++ WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7_3.TXT
2024078 trailer

对于这个简单的案例,我选择使用 cut 而不是 awk(少打一点)来提取通用/基本文件前缀:

$ ls WP*_?_?.TXT | cut -d"_" -f1-8 | sort -u | while read -r fprefix
do
    # concatenate source files
    cat ${fprefix}_[123].TXT > ${fprefix}.TXT

    # display concatenated files
    echo "+++++++ ${fprefix}.TXT"
    cat ${fprefix}.TXT
    echo ""
done

+++++++ WP2024078_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_3.TXT
2024916 header
2024916 data
2024916 trailer

+++++++ WP2024916_191_FACETS_DAILY_CLAIMS_EXTRACT_20171110094055_7.TXT
2024078 header
2024078 data
2024078 trailer

【讨论】:

  • 非常感谢..它起作用了,我所做的只是从 ls 命令中删除了 WP,因为我也可以将文件名以其他字母开头..我想在这里添加的另一件事是我想删除 3 个源文件并只保留最终文件..我怎样才能删除那个..?
  • 如果${fprefix} 是正确的,您可以删除 3x 源文件,例如:rm ${fprefix}_?_?.TXT
  • 再次感谢您的大力帮助...您真是天才!!!你让我今天一整天都感觉很好 !!!!!!这是我使用的最终代码 ****************************************** ******* ls *??.TXT |剪切 -d"" -f1-8 |排序-u | while read -r fprefix do # 连接源文件 cat ${fprefix}_[123].TXT > ${fprefix}.TXT # 显示连接后的文件 echo "+++++++ ${fprefix}.TXT" cat $ {fprefix}.TXT rm ${fprefix}?.TXT echo "" 完成 ***************************** *************
  • 太棒了!现在你可以让我的一天......投票和/或接受答案:-);见what should I do when someone answers my question
【解决方案2】:
ls *_?_?.TXT |  while read -r filename
do
    # concatenate source files
    cat $filename >> ${filename%_*}.TXT
    rm $filename
done

将文件内容添加到编号部分被切断的目标文件中。

不需要cutsort,但不会覆盖现有的目标文件。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2022-01-22
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多