循环用于替换不同文件中的其他字符串

时间:2016-12-20 09:24:27

标签: android bash for-loop sed multiple-files

我有两个列表

list1的:

A:1
B:3
C:1
D:5

列表2:

1:blue
3:green
5:red

我该怎么做才能有:

所需的输出(file3):

A:blue
B:green
C:blue
D:red

这是我的工作代码......

#!/system/bin/bash
list1=$(cat file1)
list2=$(cat file2)
for i in "$list1"; do
num_file1=$( echo $i | cut -d ":" -f 2)
string_file2=$(cat $list2 | grep "$num_file1" | cut -d ":" -f 2)
echo -e "$i" | sed "s/$num_file1/$string_file2/" > list3
done

我也试过了 sed 's/"$num_file1"/"$string_file2"/'和许多其他但每次都失败了我想要的东西..我在哪里用sed拧干?

Ps:它在Android上...并且很少有命令被迷惑......

3 个答案:

答案 0 :(得分:0)

试试这个awk系列:

awk -F':' 'NR==FNR{k[$1]=$2;next}{print $1 FS k[$1]}' f2 f1

我没有测试代码,但它应该可以工作。

注意这假设file1中的所有idx我们在file2中都有相应的条目

答案 1 :(得分:0)

awk解决方案非常好。使用较小的命令,您可以说:

sort -t \: -k 2 list1 | join -t \: -1 2 - list2 | cut -d \: -f 2,3 | sort -t \:

答案 2 :(得分:0)

  

我在哪里被sed搞砸了?

你很亲密,只在三个地方错了。

  • for i in "$list1"; do必须为for i in $list1; do,不带引号,因为您要单独处理行,而不要一次处理整个$list1
  • string_file2=$(cat $list2 | …)必须与string_file2=$(echo "$list2" | …)一起使用echo而不是cat(因为您已经将file2读入变量$list2中)并且用引号引起来以保持行分隔。
  • 必须将输出重定向> list3echo -e "$i" | sed …行移到done行的末尾,否则仅最后一条输出行将保留在file3中。

解决该问题的另一种方法是对颜色使用数组,并按颜色的编号进行索引:

#!/bin/bash
eval rgb=($(sed 's/\(.*\):/[\1]=/' <file2)) # change 1:blue to [1]=blue etc.
while IFS=: read letter number
do  echo $letter:${rgb[$number]}            # change A:1 to A:blue etc.
done <file1 >file3