我需要一个脚本来编辑文件。我已经对此有点疯狂了:))。
我有两个文件:
143956;lorem
143957;ipsum
143958;lala
143959;vuvu
和第二
512;143956;15
2156;143957;15
153;143958;4968
2156;143959;486
我需要的是以这种方式将这两个文件组合在一起:
512;143956;lorem;15
2156;143957;ipsum;15
153;143958;lala;4968
2156;143959;vuvu;486
这看起来并不那么困难,可能paste
就足够了,但这是一个问题。有些行只在其中一个文件中,但不在另一个文件中。在这种情况下,我需要在第二个文件的行上等待,然后仍然与第一个文件进行比较。
示例:
143956;lorem
143957;ipsum
143959;vuvu //here "lulu" is missing, will compare with 3rd line (143958) but the script wont declare this as "not found" but keep on searching till finds 143959 (which is already on 4 in this case).
512;143956;15
2156;143957;15
153;143958;4968
2156;143959;486
输出看起来像这样:
512;143956;lorem;15
2156;143957;ipsum;15
2156;143959;vuvu;486
或者更好的方式
512;143956;lorem;15
2156;143957;ipsum;15
153;143958;*WAS NOT FOUND*;4968
2156;143959;vuvu;486
但我可以自己完成......
希望这是可以理解的。非常感谢您的帮助。
答案 0 :(得分:1)
如果第一个文件不是太大,您可以按照您指定的顺序执行(test1
和test2
两个文件):
#!/bin/sh
for line in `cat test2`; do
number=`echo "$line" | grep -o ";[0-9]*;" | sed 's/;//g'`
repl=`grep "$number;" test1`
if [ -z "$repl" ]; then
echo "$line" | sed "s#;$number;#;$number;*WAS NOT FOUND*;#g"
else
echo "$line" | sed "s#;$number;#;$repl;#g"
fi
done
答案 1 :(得分:1)
使用Bash流程替换(<()
)和join
实用程序:
join -t \; -1 1 -2 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2)
或者您可以预先输出文件。
输出file2中出现但未出现在file1中的记录:
join -t \; -1 1 -2 2 -v 2 -o 2.1,2.2,1.2,2.3 <(sort file1) <(sort -t \; -k2,2 file2) | sed 's/;;/;*WAS NOT FOUND*;/'