Как взять значения из двух столбцов в текстовом файле и сопоставить их со значениями в другом

У меня есть два текстовых файла, отформатированных следующим образом:

например. Файл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 миллионов строк), поэтому было бы полезно, если бы сценарий был эффективным.

0
15.04.2016, 16:38
2 ответа

В качестве примера можно взять следующий сценарий:

#!/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

Это ваша цель?

0
28.01.2020, 04:51

Попробуйте следующее:

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
0
28.01.2020, 04:51

Теги

Похожие вопросы