我有两个列表
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上...并且很少有命令被迷惑......
答案 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
中)并且用引号引起来以保持行分隔。> list3
从echo -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