Как сравнить содержимое внутри txt?

sed действительно не лучший инструмент для работы, вам нужно что-то с лучшими возможностями написания сценариев. Вот несколько вариантов:

  • perl

     perl -000pe 's / Instant / $ &. $. / e 'file 
     

    -p означает «печатать каждую строку» после применения любого сценария, заданного с помощью -e . -000 включает «режим абзаца», поэтому записи (строки) определяются последовательными символами новой строки ( \ n ), это позволяет правильно обрабатывать строки с двойным интервалом. $ & - последний найденный шаблон, а $. - номер текущей строки входного файла. e в s /// e позволяет мне оценивать выражения в операторе подстановки.

  • awk (предполагается, что ваши данные в точности такие, как показано, с тремя полями, разделенными пробелами)

     awk '{if (/./) print $ 1, $ 2 ++ k, $ 3; else print} 'file 
     

    Здесь мы увеличиваем переменную k k , только если текущая строка не пуста /./ в этом случае мы также печатаем необходимую информацию. Пустые строки печатаются как есть.

  • различные оболочки

      n = 0; пока читаем -r a b c; сделать 
    если ["$ a"]; затем 
     ((n ++)) 
    printf "% s% s% s% s \ n" "$ a" "$ b" "$ n" "$ c" 
    else 
    printf "% s% s% s \ n" "$ a" "$ b" "$ c" 
    fi 
    done 

    Здесь каждая строка ввода автоматически разделяется на пробелы, а поля сохраняются как $ a , $ b и $ c . Затем внутри цикла $ c увеличивается на единицу для каждой строки, для которой $ a не является пустым, и его текущее значение печатается рядом со вторым полем, $ b .

ПРИМЕЧАНИЕ: все вышеперечисленные решения предполагают, что все строки в файле имеют один и тот же формат. Если нет, ответ @Stephane - это то, что вам нужно.


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

for file in ./*; do perl -i -000pe 's/instant/$& . $./e' "$file"; done

ВНИМАНИЕ: это предполагает простые имена файлов без пробелов, если вам нужно разобраться с чем-то более сложным, используйте (при условии ksh93 , zsh или bash ):

find . -type f -print0 | while IFS= read -r -d ''; do
    perl -i -000pe 's/instant/$& . $./e' "$file"
done
0
14.01.2019, 05:19
3 ответа

Подтверждено вbash:

#!/bin/bash

file=/path/to/output.txt

if [[ $(awk -F, 'NR==1 {print $1}' $file) -eq $(awk -F, 'NR==2 {print $1}' $file) ]]; then

awk -F, 'NR==2 {print $2}' $file

else

echo "The value is different"

fi

-Переменной fileприсваивается путь к файлу output.txt.

-В операторе ifawkиспользует ,в качестве разделителя, печатает и сравнивает вторые значения второго столбца в каждой строке.

-Если значения равны, то печатается второй столбец второй строки, который равен5.5

-Если значения не равны, то печатается «Значение отличается».

Я протестировал это с двумя файлами с указанными вами значениями. Вы можете изменить значение переменной fileв скрипте для работы с другими.

2
28.01.2020, 02:14

С этим можно справиться с помощью сценария AWK:

#!/usr/bin/awk -f
BEGIN { FS = "," }
NR == 1 { value = $1 }
NR == 2 {
    if ($1 == value) print $2
    else print "The value is different"
    exit
}

Это сохраняет первое значение в первой строке, затем сравнивает его с первым значением во второй строке и печатает второе значение, если они равны, или «Значение отличается» в противном случае.Затем он явно завершает работу, чтобы не тратить время на чтение дальнейших строк.

4
28.01.2020, 02:14

Я пытался использовать команды sed и awk

#!/bin/bash
i=`sed -n '1p' l.txt| awk -F "," '{print $1}'`
j=`sed -n '2p' l.txt| awk -F "," '{print $1}'`
if [[ $i == $j ]]
then
awk -F "," 'NR==2{print $2}' l.txt
else
echo "The value is different"
fi

выход

5.5
1
28.01.2020, 02:14

Теги

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