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
Подтверждено в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.
-В операторе if
awk
использует ,
в качестве разделителя, печатает и сравнивает вторые значения второго столбца в каждой строке.
-Если значения равны, то печатается второй столбец второй строки, который равен5.5
-Если значения не равны, то печатается «Значение отличается».
Я протестировал это с двумя файлами с указанными вами значениями. Вы можете изменить значение переменной file
в скрипте для работы с другими.
С этим можно справиться с помощью сценария 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
}
Это сохраняет первое значение в первой строке, затем сравнивает его с первым значением во второй строке и печатает второе значение, если они равны, или «Значение отличается» в противном случае.Затем он явно завершает работу, чтобы не тратить время на чтение дальнейших строк.
Я пытался использовать команды 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