Linux中根据匹配字符串将单个文件拆分为多个文件

ner*_*erd 3 awk text-processing split

我有一个包含以下内容的文件:

文件.txt:

661###############20160315###
###########################
###########################
661###############20160316###
###########################
661###############20160317###
###########################
Run Code Online (Sandbox Code Playgroud)

我想根据起始字符串“661”和日期(2016MMDD)将此单个文件拆分为多个文件,并将拆分文件重命名为 20160315.txt、20160316.txt 等。例如,每个拆分文件将具有:

20160315.txt 将有:

661###############20160315########
################################
################################
Run Code Online (Sandbox Code Playgroud)

20160316.txt 将有:

661###############20160316########
################################
Run Code Online (Sandbox Code Playgroud)

20160317.txt 将有:

661###############20160317#######
###############################
Run Code Online (Sandbox Code Playgroud)

是否有一个 awk 命令可以做到这一点?

mau*_*wns 7

我确信有一个awk命令可以做到这一点,我不够熟练,awk无法提出解决方案。与此同时,你可以使用这样的东西:

#!/bin/bash

csplit -z tosplit /661/ {*}

for file in xx*; do
    newName=$(egrep -o '2[0-9]{7}' $file)
    mv $file $newName.txt
done
rm -rf xx*
Run Code Online (Sandbox Code Playgroud)

tosplit这个文件在哪里(你的示例文件):

661###############20160315###
###########################
###########################
661###############20160316###
###########################
661###############20160317###
###########################
Run Code Online (Sandbox Code Playgroud)

运行此脚本后(在与tosplit文件相同的目录中)我得到三个文件:

ls 2016031*
20160315.txt  20160316.txt  20160317.txt
Run Code Online (Sandbox Code Playgroud)

...看起来像这样:

cat 20160315.txt 
661###############20160315###
###########################
###########################

cat 20160316.txt 
661###############20160316###
###########################

cat 20160317.txt 
661###############20160317###
###########################
Run Code Online (Sandbox Code Playgroud)

您也可以(?)csplit用来命名文件,但这也超出了我的薪水!

  • 非常适合使用 `csplit`。您可以命名文件前缀,并且使用 GNU `csplit`,您可以指定扩展格式,但您不能根据文件的内容来执行此操作,因此我怀疑这会得到很大改善。`csplit`,而不是 Awk,*是*这项工作的工具。 (2认同)