【发布时间】:2019-12-23 01:16:17
【问题描述】:
我有一个名为 test2.txt 的文件,内容如下:
string_9989 1.000 1.4567
string_9989 1.001001 1.2345
string_9989 1.1111111 2.22222222 3.33333333
string_9989 1.0000 1.4567 2.3456
string_1234 1.000000 1.3456
string_1234 1.3456 2.3456 3.5678
string_1234 1.234 3.456 5.678 6.789
string_1234 1.2 3.4 4.5 5.6
string_9989 的第一个实例与 string_1234 的第一个实例相关; string_9989 的第二个实例与 string_1234 的第二个实例相关,等等。我想提取每个字符串实例的行并将它们打印到新文件中(所以从 string_9989 和 string_1234 的第一个实例到 1 个文件的行,第二个实例每个到另一个文件等)。我的想法是将索引附加到字符串的每个实例并使用 grep 提取该实例并打印到新文件,但我无法成功创建索引。
我尝试了以下代码:
- 将 string_[0-9] 的每个唯一实例保存到数组中
- 循环遍历数组,使用 sed 将 _$j 添加到字符串的末尾
#!/bin/bash
mapfile -t string_array < <( grep -Eio "string_[0-9]*" test2.txt | sort -u )
for i in ${string_array[@]}; do
count_path=$(grep -c $i test2.txt)
j=0
while [ $count_path -gt 0 ]; do
sed -i "$j,/$i/{s/\<$i\>/&_$j/}" test2.txt
let count_path=$(expr $count_path - 1)
let j=j+1
done
done
我期待这个输出:
string_9989_0 1.000 1.4567
string_9989_1 1.001001 1.2345
string_9989_2 1.1111111 2.22222222 3.33333333
string_9989_3 1.0000 1.4567 2.3456
string_1234_0 1.000000 1.3456
string_1234_1 1.3456 2.3456 3.5678
string_1234_2 1.234 3.456 5.678 6.789
string_1234_3 1.2 3.4 4.5 5.6
但我却得到了这个:
string_9989_0 1.000 1.4567
string_9989_1 1.001001 1.2345
string_9989_2 1.1111111 2.22222222 3.33333333
string_9989_3 1.0000 1.4567 2.3456
string_1234_0 1.000000 1.3456
string_1234 1.3456 2.3456 3.5678
string_1234 1.234 3.456 5.678 6.789
string_1234 1.2 3.4 4.5 5.6
为什么没有完成第二个字符串的追加?我正在使用 bash 版本 4.1.2(1)
【问题讨论】:
-
我建议您专注于满足您实际需求的解决方案。否则,此问题是XY problem 的示例。
-
我明白了。这是我的第一篇文章,所以....我提出了我的问题以及到目前为止我为实现目标所做的工作。如果您没有解决方案,您为什么要发帖?
-
I want to extract the line for each instance of the strings and print them to new files- 那你为什么要在字段中添加后缀?那么,你想提取它还是添加后缀?
标签: bash sed while-loop grep