我有两个具有这种结构的文件:
文件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 sed
和info 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对速度不是很好。