我有两个这种结构的文件:
FILE1.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,,
FILE2.TXT:
0015
0016
0017
0018
0019
我想按顺序用File2.txt替换File1.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,,
我还没有找到一个有效的循环,任何帮助都将受到赞赏
谢谢。
答案 0 :(得分:3)
<强>更新强>
使用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
答案 1 :(得分:0)
将第二个文件读入线性阵列。将它用作查找表,通过第一个文件的第一个字段进行索引。使用非数字键时,请使用关联数组。
readarray -t mapping < File2.txt # -t strips trailing newlines
while IFS= read -r l;
do pref=${l%%,*};
printf '%s%s\n' "${mapping[pref-1]}" ",${l#*,}"
done < File1.txt
或"${l#[0-9]}"
,或者其他任何方式对于获取您未替换的部分内容最具前瞻性。
或shopt -s extglob
和"${l#+([0-9])}"
(正则表达式[0-9]+
的extglob版本)
这是纯粹的bash,没有外部命令。如果输入文件可能很大,则perl中的相同算法可能会更快。 bash对速度不是很好。