У меня есть два текстовых файла, отформатированных следующим образом:
например. Файл1:
900 480 10060.62 2740 -266864.19 3843493.50 2740.00 2740 176.07
900 479 10046.50 2741 -266874.34 3843486.00 2741.00 2741 176.07
900 478 10032.38 2742 -266884.47 3843478.50 2742.00 2742 176.07
900 477 10018.26 2743 -266894.62 3843471.00 2743.00 2743 176.07
например. File2:
-2.68785700E+05 3.84401270E+06 313.33 2740.00 313.33 2740 1.401298E-044 2 LY1-0900
-2.68783800E+05 3.84400040E+06 313.35 2741.00 313.35 2741 1.401298E-044 2 LY1-0900
-2.68781900E+05 3.84398810E+06 313.36 2742.00 313.36 2742 1.401298E-044 2 LY1-0900
-2.68780000E+05 3.84397580E+06 313.38 2743.00 313.38 2743 1.401298E-044 2 LY1-0900
Мне нужно заменить первые два столбца в файле 2 на 5-й и 6-й столбцы в File1 на основе совпадений со значениями в 1-м и 7-м столбцах в файле 1 и 9-м и 4-м столбцах в файле 2.
Звучит очень запутанно, позвольте мне привести пример того, что будет делать сценарий ...
Возьмите первую строку из файла 2, найдите строку в файле 1, где первое значение столбца (900) совпадает с последними 4 цифры 9-го столбца (0900) И 7-го (2740,00) соответствуют 4-му (2740,00), затем замените столбцы 1 и 2 в файле 2 на 5-й и 6-й столбцы из файла 1.
т.е.
-2.68785700E+05 3.84401270E+06 313.33 2740.00 313.33 2740 1.401298E-044 2 LY1-0900
становится
-266864.19 3843493.50 313.33 2740.00 313.33 2740 1.401298E-044 2 LY1-0900
ЗАТЕМ перейти к следующей строке и т. Д., Наконец, выводя новый файл.
Желаемый результат будет выглядеть так:
-266864.19 3843493.50 313.33 2740.00 313.33 2740 1.401298E-044 2 LY1-0900
-266874.34 3843486.00 313.35 2741.00 313.35 2741 1.401298E-044 2 LY1-0900
-266884.47 3843478.50 313.36 2742.00 313.36 2742 1.401298E-044 2 LY1-0900
-266894.62 3843471.00 313.38 2743.00 313.38 2743 1.401298E-044 2 LY1-0900
Я в основном пытаюсь найти новые пространственные координаты двухмерной поверхности.
Значения не всегда могут быть в порядке, а файлы могут быть относительно большими (6 миллионов строк), поэтому было бы полезно, если бы сценарий был эффективным.
В качестве примера можно взять следующий сценарий:
#!/bin/sh
outfile="outfile"
echo "testfile1:"
cat testfile1
echo "testfile2:"
cat testfile2
cat /dev/null > $outfile
cat testfile1 | while read line; do
matchfirst="`echo $line | awk '{print $3}'`"
matchsecond="`echo $line | awk '{print $4}'`"
finded="false"
while read defline; do
tplfirst="`echo $defline | awk '{print $3}'`"
tplsecond="`echo $defline | awk '{print $4}'`"
if [ "$tplfirst" = "$matchfirst" ] && [ "$tplsecond" = "$matchsecond" ]; then
echo -n "`echo $defline | awk '{print $1}'` `echo $defline | awk '{print $2}'` `echo $line | awk '{print $3}'` `echo $line | awk '{print $4}'`" >> $outfile
echo >> $outfile
finded="true"
fi
done < testfile2
if [ "$finded" = "false" ]; then
echo $line >> $outfile
fi
done
echo "outfile:"
cat outfile
Пример использования:
➜ sild@$work 15:29:55 [test]$ ./replacer.sh
testfile1:
1 2 3 4
5 6 7 8
9 10 11 12
testfile2:
11 21 3 4
51 61 7 8
9 10 111 121
outfile:
11 21 3 4
51 61 7 8
9 10 11 12
Это ваша цель?
Попробуйте следующее:
awk 'FNR==NR{
a[$1"@"$7]=$5" "$6;
next
}
{
i=length($NF);
n=substr( $NF, i-2, i);
if( n"@"$4 in a) {
split(a[n"@"$4],b," ")
};
$1=b[1];
$2=b[2]
}
1' file1 file2