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

时间:2015-04-17 19:23:57

标签: bash loops for-loop

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

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,,

我还没有找到一个有效的循环,任何帮助都将受到赞赏

谢谢。

2 个答案:

答案 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 sedinfo 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对速度不是很好。