Сравнить строку за строкой в ​​файле linux - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть файл (test1.txt), подобный этому:

100 100
200 200
300 HR
400 IT
500 500
600 600

И я хочу получить желаемый вывод, подобный этому:

100 100 0
200 200 0
300 HR  1
400 IT  1
500 500 0
600 600 0

Я уже пытаюсь выполнить эту команду:

#!/bin/bash

awk1=`awk '{print $1}' test1.txt`
awk2=`awk '{print $2}' test1.txt`

if [ "$awk1" = "$awk2" ]; then
        echo "0"
else
        echo "1"
fi

но результат не такой, как я ожидал.

Ответы [ 4 ]

5 голосов
/ 18 февраля 2020

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

awk '{$(NF+1)=$1==$2?0:1} 1' Input_file

ИЛИ, чтобы иметь выходной разделитель табуляции, попробуйте:

awk 'BEGIN{OFS="\t"} {$(NF+1)=$1==$2?0:1} 1' Input_file

Объяснение: Добавление подробное объяснение вышеуказанного кода.

awk '                   ##Starting awk program from here.
{
  $(NF+1)=$1==$2?0:1    ##Creating a new NF+1 field which will be newer last field and its value will be decided as per condition:
}                       ##If $1 and $2 are equal then set 0 or set 1 its value.
1                       ##1 will print the complete line value here(including new last field value).
' Input_file            ##Mentioning Input_file name here.
3 голосов
/ 18 февраля 2020

Разновидностью является просто проверка равенства полей между $1==$2, и, если они равны, добавьте " 0", в противном случае добавьте " 1", например,

$ awk '$1==$2{print $0" 0"; next } {print $0" 1"}' file
100 100 0
200 200 0
300 HR 1
400 IT 1
500 500 0
600 600 0

, которое можно сократить до awk '{print $0, $1!=$2}' file с небольшой потерей читаемости.

2 голосов
/ 18 февраля 2020

Другой подход:

awk '{ printf "%s\t%s\t%d\n", $1, $2, $1 != $2 }' test1.txt
0 голосов
/ 18 февраля 2020

Awk довольно хорошо, но мне интересно, может ли sed это сделать? Так что здесь это вариант с sed.

sed 's/\(^.*\) \1/& 0/;t;s/$/ 1/' file

Пояснение, первая команда s/\(^.*\) \1/& 0/

  • \ (^. * \) - определить 1-й столбец
  • \ 1 - добавить копию 1-го столбца

Итак, у нас есть 1-й столбец и его копия в шаблоне, и, если образец соответствует, мы меняем его на себя (&) + «0», тогда t выполнит следующую команду s, если первые не совпадают. Вторая команда s/$/ 1/ просто добавьте '1' в конец строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...