如何根据内容将一个文本文件拆分为多个文本文件?

如何根据内容将一个文本文件拆分为多个文本文件?

我有一个名为 CAMS.txt 的文本文件,其中包含以下内容:

4153999999999991
4153999999999992
4153999999999993
4153999999999994
4801999999999991
4801999999999992
4801999999999993

我想将 CAMS.txt 文件拆分为 2 个文件 - CAMS1.txt 和 CAMS2.txt。它们的内容如下

CAMS1.txt

4153999999999991
4153999999999992
4153999999999993
4153999999999994

CAMS2.txt

4801999999999991
4801999999999992
4801999999999993

它实际上是根据原始 CAMS.txt 文件的前 4 位数字来分割文件。它永远是 4153 和 4801。我是 UNIX 世界的新手 =)

答案1

awk '/^4153/ {print >"CAMS1.TXT"; next} {print >"CAMS2.TXT"}' CAMS.TXT

还有其他方法可以做到这一点,另一种方法是使用两个 grep 命令

grep "^4153" CAMS.TXT > CAMS1.TXT
grep -v "^4153" CAMS.TXT > CAMS2.TXT

这效率较低,但更容易键入,在第一个 grep 完成后,您可以从 shell 历史记录中调用它(使用“向上”箭头键)并进行一些更改。当然,文件会被读取两次,所以如果文件很大就不要这样做。

答案2

对于您已经知道文本的特殊情况,您可以执行类似的操作

while read line; do 
    [[ $line =~ ^4153 ]] && 
        printf "%s\n" "$line" >> CAMS1.TXT || 
        printf "%s\n" "$line" >> CAMS2.TXT 
done < CAMS.TXT 

这会将 的每一行读CAMS.TXT入变量$line,然后,如果$line以 4153 开头,则打印到 CAMS1,如果不是,则打印到 CAMS2。

或者,您可以根据第一个数字将每一行打印到标准错误或标准输出,并相应地重定向命令的输出。例如:

perl -ne '/^4153/ ? print STDOUT : print STDERR' CAMS.TXT >CAMS1.TXT 2>CAMS2.TXT 

如果您不知道文本是什么,您可以将每一行写入一个文件,该文件的名称是该行的前 4 个字符:

awk '{print >> substr($1,1,4)}' CAMS.TXT 

上面将创建两个文件,4153每个4801文件都包含您期望的行。这样做的优点是可以处理任意数量的不同模式。

答案3

这里有一个纯粹的bash变体terdon 更通用的解决方案

while read line; do 
  echo "$line" >> "${line:0:4}.txt"
done < CAMS.txt

生成的文件将根据其中每行的前四个字符进行命名,例如4153.txt4801.txt对于示例输入。

以下代码片段可用于将生成的文件批量重命名为CAMS1.txtCAMS2.txt(假设原始输入中每行的前四个字符实际上是数字)。

i=1
for file in [0-9][0-9][0-9][0-9].txt; do
  mv "$file" "CAMS$(( i++ )).txt"
done

这依赖于原始输入文件中的数字按递增顺序排列的观察结果,并且示例输出文件的文件编号与此顺序相对应。

解释:

while read line; do 
  ...
done < CAMS.txt

迭代文件CAMS.txt,依次将每一行读入变量中line

echo "$line" >> "${line:0:4}.txt"

将当前正在处理的行追加到文件中,该文件的名称是从当前行的前四个字符获取的。


i=1

将值赋给1变量i

for file in [0-9][0-9][0-9][0-9].txt; do
  ...
done

迭代当前目录中名称中包含四位数字并以.txt扩展名结尾的文件。上面代码片段中的[0-9][0-9][0-9][0-9].txt称为 shell全局。此功能可用于匹配或扩展特定类型的模式,在本例中为文件名。

mv "$file" "CAMS$(( i++ )).txt"

重命名当前正在处理的文件file。目标文件名"CAMS$(( i++ )).txt“由前缀CAMS与变量的当前值连接组成i。变量i在一个变量内同时递增。bash 算术表达式,如语法所示(( ... )),使用后缀增量运算符++$前面的附加(( ... ))导致表达式的值,在本例中为i 增量,将扩展为指示目标文件名的字符串。最后,将后缀.txt附加到目标文件名。

相关内容