![命令行 - 有条件地保存子字符串](https://linux22.com/image/205810/%E5%91%BD%E4%BB%A4%E8%A1%8C%20-%20%E6%9C%89%E6%9D%A1%E4%BB%B6%E5%9C%B0%E4%BF%9D%E5%AD%98%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
命令行实用程序可以有条件地将子字符串保存在不同的文件中吗?我有一个文件 ( 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
我的目标是与20020731
in file 1
、20071103
with 20071107
in file2
和 20090225
with 20090230
in file一起保存3
?
:
我可以使用以下命令提取所需的子字符串,但这样做会丢失参考数字:
$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'
20020711
20020731
20071103
20071107
20090225
20090230
/
使用命令行时是否可以构建三个单独的文件,其中前面的第一个数字作为目标参考?目标可能与原始文本文件位于同一目录。
- 文件:
20020711
20020731
- 文件:
20071103
20071107
- 文件:
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