Как мне проверить, является ли поле пустым или нулевым в текстовом файле, используя awk и bash

#linux #bash #awk #scripting #suse

#linux #bash #awk #сценарии #suse

Вопрос:

У меня есть два текстовых файла, и я хочу сравнить их соответствующие значения в соответствии с их строками и столбцами. Каждое значение (поле) в текстовом файле разделено табуляцией.

Вот файлы:

file1.txt

 Name  Col1  Col2  Col3  
-----------------------
row1  1     4     7        
row2  2     5     8         
row3  3     6     9 
  

file2.txt

 Name  Col1  Col2  Col3  
-----------------------
row2  1     4     11        
row1  2     5     12
row3  3          9 
  

Вот код, который у меня есть на данный момент:

 awk '
FNR < 2 {next}                       
FNR == NR {           
    for (i = 2; i <= NF; i  ) {
        a[i,$1] = $i;      
    }              
    next;       
}

# only compare if a row in file2 exists in file1
($1 in b) {                                          
    for (i = 2; i <= NF; i  ) 
    {
        if (a[i,$1] == $i) 
        {
             print "EQUAL"       
        }
        else if ( //condition that checks if value is null// )
        {
             print "NULL" 
        }
        else
        {
             print "NOT EQUAL"
        }
    }
}' file1.txt file2.txt
  

У меня возникают трудности с проверкой наличия нулевого значения ( row3 и col2 in file2.txt ) file2.txt . Я даже не получаю вывод для этого нулевого значения. До сих пор я пробовал if ($i == "") , и это все еще не дает мне никаких результатов. Есть предложения? Спасибо. (Я использую gnu awk в скрипте bash)

Дайте мне знать, если требуется дополнительное объяснение.

Комментарии:

1. @EdMorton Я уже упоминал, что значения (или поля) в каждом текстовом файле разделены табуляциями в вопросе! Это в первом абзаце вопроса.

2. Итак, вы это сделали, я этого не заметил, я просто увидел, что ваш скрипт не использует табуляции в качестве разделителей.

3. @EdMorton не awk проверяет табуляцию автоматически?

4. Если вы имеете в виду, использует ли awk табуляции в качестве разделителя полей по умолчанию — нет, он использует любую последовательность непрерывных символов пробела.

Ответ №1:

Просто установите FS на tab:

 awk -F't' '....'
  

Комментарии:

1. Должен ли я иметь следующее условие для проверки, является ли поле null: if ($i == "") {//do something} ?

2. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что после последнего поля в каждой строке могут быть дополнительные таблицы. Таким образом, есть дополнительные выходные данные, которых не должно быть. Как мне это исправить?

3. @Alias: удалите лишние вкладки. Каждая вкладка означает, что есть дополнительное поле. AWK не может определить, где, по вашему мнению, вкладка является полем, а где нет. Вы могли бы удалить строки в конце, но как насчет пропущенных значений для Col3 , тогда?