我有一个名为 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.txt
和4801.txt
对于示例输入。
以下代码片段可用于将生成的文件批量重命名为CAMS1.txt
等CAMS2.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
附加到目标文件名。