命令行 - 有条件地保存子字符串

命令行 - 有条件地保存子字符串

命令行实用程序可以有条件地将子字符串保存在不同的文件中吗?我有一个文件 ( file.txt),其中包含如下几行。

1/1_ABCD4.txt:20020711
1/1_ABCD10.txt:20020731
2/2_ABCD2.txt:20071103
2/2_ABCD5.txt:20071107
3/3_ABCD1.txt:20090225
3/3_ABCD3.txt:20090230

20020711我的目标是与20020731in file 120071103with 20071107in file220090225with 20090230in file一起保存3

:我可以使用以下命令提取所需的子字符串,但这样做会丢失参考数字:

$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'

20020711
20020731
20071103
20071107
20090225
20090230

/使用命令行时是否可以构建三个单独的文件,其中前面的第一个数字作为目标参考?目标可能与原始文本文件位于同一目录。

  1. 文件:
20020711
20020731
  1. 文件:
20071103
20071107
  1. 文件:
20090225
20090230

谢谢。

答案1

awk

awk -F'[:/]' '{print $NF > $1}' file

/我们使用和作为分隔符来分割行:。最后一个字段 ( $NF) 是要打印的内容,第一个字段 ( $1) 是输出文件名。


运行测试输入文件后:

$ head 1 2 3
==> 1 <==
20020711
20020731

==> 2 <==
20071103
20071107

==> 3 <==
20090225
20090230

另外,根据您的数据,最好在此操作之前添加一个条件,以避免打印到具有随机名称的文件,如果我们有更多具有不同结构的行,输入可能会很危险。

一个简单的例子,如果我们只想在第一个字段(文件名)只有数字时打印:

awk -F'[:/]' '$1 ~ /^[0-9]+$/ {print $NF > $1}' file

答案2

使用sed

$ sed s'~\([0-9]\)/[^:]*:\(.*\)~echo \2 >> \1~e' file.txt
$ cat 1
20020711
20020731

相关内容