Больше условий в awk;добавление столбца в соответствии с условием - PullRequest
0 голосов
/ 14 октября 2019

Как добавить столбец 5 в соответствии с условиями для столбца 1?

ввод:

word2       1   2   3  
word3       5   6   2   
word2       8   9   6
word1       5   6   6
word5       7   8   8
word4       9   8   6

awk '{ if ( ( $1 ~ /word1/ {$5 == "0.0697") &&
            ( $1 ~ /word2/ {$5 == "0.0645") &&
            ( $1 ~ /word3/ {$5 == "0.0655") &&
            ( $1 ~ /word4/ {$5 == "0.0677") &&
            ( $1 ~ /word5/ {$5 == "0.0678") ) {print $1, $2, $3, $4, $5}}' input > output

Желаемый вывод:

word2       1   2   3   0.0645
word3       5   6   2   0.0655
word2       8   9   6   0.0645
word1       5   6   6   0.0697
word5       7   8   8   0.0678
word4       9   8   6   0.0677

Ответы [ 3 ]

2 голосов
/ 14 октября 2019
awk '$1 ~ /word1/ {$5 = "0.0697"};
     $1 ~ /word2/ {$5 = "0.0645"};
     $1 ~ /word3/ {$5 = "0.0655"};
     $1 ~ /word4/ {$5 = "0.0677"};
     $1 ~ /word5/ {$5 = "0.0678"}; 
     {print}' file

Выход:

word2 1 2 3 0.0645
word3 5 6 2 0.0655
word2 8 9 6 0.0645
word1 5 6 6 0.0697
word5 7 8 8 0.0678
word4 9 8 6 0.0677
2 голосов
/ 14 октября 2019

Не могли бы вы попробовать следующее.

awk '{ if( $1 ~ /word1/) {$5 = "0.0697"}
       else if ( $1 ~ /word2/) {$5 = "0.0645"}
       else if ( $1 ~ /word3/) {$5 = "0.0655"}
       else if ( $1 ~ /word4/) {$5 = "0.0677"}
       else if ( $1 ~ /word5/) {$5 = "0.0678"}
     }
{
   print $1, $2, $3, $4, $5
}
'  Input_file

Или вы можете поставить 1 вместо print $1, $2, $3, $4, $5 тоже в коде, как показано ниже:

awk '{ if( $1 ~ /word1/) {$5 = "0.0697"}
       else if ( $1 ~ /word2/) {$5 = "0.0645"}
       else if ( $1 ~ /word3/) {$5 = "0.0655"}
       else if ( $1 ~ /word4/) {$5 = "0.0677"}
       else if ( $1 ~ /word5/) {$5 = "0.0678"}
     }
1
'  Input_file

Проблемы с подходом OP:

{$5 == "0.0697"):

1 - Мы не должны использовать ==, который используется для проверки состояния, вместо этого используйте =.

2- Используйте }, чтобы закрыть его при назначении значений.

1 голос
/ 14 октября 2019

Вот более общий подход. Это должно быть быстро, так как вы не проверяете каждую строку на все возможные числа, и его легко развернуть.

awk 'BEGIN {split("0.0697 0.0645 0.0655 0.0677 0.0678",a," ")} {split($1,b,"[^0-9]+");print $0,a[b[2]]}' file
word2       1   2   3 0.0645
word3       5   6   2 0.0655
word2       8   9   6 0.0645
word1       5   6   6 0.0697
word5       7   8   8 0.0678
word4       9   8   6 0.0677

С этим вы можете получить числа из ключевого файла:

key="0.0697 0.0645 0.0655 0.0677 0.0678"
awk -v k="$key" 'BEGIN {split(k,a," ")}{split($1,b,"[^0-9]+");print $0,a[b[2]]}' file
word2       1   2   3 0.0645
word3       5   6   2 0.0655
word2       8   9   6 0.0645
word1       5   6   6 0.0697
word5       7   8   8 0.0678
word4       9   8   6 0.0677
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...