BASH 用循环按顺序替换两个变量



我有两个具有这种结构的文件:

文件1.txt:

1,,
1,,
1,,
1,,
1,,
1,,
1,,
1,,
2,,
2,,
2,,
2,,
2,,
2,,
3,,
3,,
3,,
3,,
4,,
4,,
4,,
4,,
4,,
5,,
5,,
5,,
5,,

文件2.txt:

0015
0016
0017
0018
0019

我想按顺序将 File1.txt 数字替换为 File2.txt,因此它看起来像这样:

0015,,
0015,,
0015,,
0015,,
0015,,
0015,,
0015,,
0015,,
0016,,
0016,,
0016,,
0016,,
0016,,
0016,,
0017,,
0017,,
0017,,
0017,,
0018,,
0018,,
0018,,
0018,,
0018,,
0019,,
0019,,
0019,,
0019,,

而且我还没有找到一个有效的循环来做到这一点,任何帮助将不胜感激

谢谢。

更新:

使用 GNU sed 和 bash(进程替换):

sed -n -f <(sed -n "s|^([^,])(.*)$|1{h;s/[0-9]*/&2/p;g}|p" File1.txt) File2.txt > File_new.txt

请参阅:man sedinfo sed

将第二个文件读入线性数组。 将其用作查找表,按第一个文件的第一个字段进行索引。 对于非数字键,请改用关联数组。

readarray -t mapping < File2.txt  # -t strips trailing newlines
while IFS=  read -r l;
    do pref=${l%%,*};
    printf '%s%sn' "${mapping[pref-1]}" ",${l#*,}"
done < File1.txt

或者"${l#[0-9]}",或者任何其他方式将是最面向未来的,以获得你不替换的线路部分。

或者shopt -s extglob"${l#+([0-9])}"(正则表达式[0-9]+的extglob版本)

这是纯粹的打击,没有外部命令。 如果输入文件可能很大,那么perl中的相同算法可能会更快。 bash对速度不是很好。

相关内容

  • 没有找到相关文章

最新更新