【问题标题】:BASH replace two variables in order with loopBASH用循环按顺序替换两个变量
【发布时间】:2015-04-17 19:23:56
【问题描述】:

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

文件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

我想按顺序用 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,,

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

谢谢。

【问题讨论】:

    标签: bash loops for-loop


    【解决方案1】:

    更新:

    使用 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

    【讨论】:

    • 太好了!!有什么办法可以保留 File1.txt 中的更改? (我问这个是因为 File1 实际上有很多 csv 格式的列)
    • 这真是太聪明了!
    • 这将为输入文件的每一行运行一个新的 sed 进程。在 shell 中,甚至启动 perl 会更有效。
    【解决方案2】:

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

    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 不利于速度。

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      相关资源
      最近更新 更多