Сохранение той же длины записи, когда команда awk корректирует определенные данные в записи

$ sed 's/.*]//' file.txt | tr -s ' '
foo1 bar1
foo2 bar2
foo3 bar3
foo4 bar4
foo5 bar5

sedудаляет все в строке до (, включая )последнее ], а trсжимает несколько последовательных пробелов в один пробел.

В качестве альтернативы, используя толькоsed:

sed -e 's/.*]//' -e 's/  */ /g' file.txt

С заданными входными данными это дает тот же результат, что и первый конвейер.

Этот sedсначала выполняет s/.*]//, который удаляет все до](включительно ). Второе выражение соответствует ␣␣*, то есть пробелу, за которым следует ноль или более пробелов, и заменяет их одним пробелом. Второе выражение применяется ко всей строке и имеет тот же эффект, что и tr -s ' ', т. е. сжимает несколько последовательных пробелов в один пробел.


Использованиеawk:

awk -F '[][:blank:]]*' '{ print $3,$4 }' file.txt

Здесь мы используем ]или пробелы или табуляции в качестве разделителей полей (кратные из них могут разделять два столбца, поэтому мы используем *после[...]). С учетом этих разделителей нужные данные доступны в полях 3 и 4 каждой строки.


После того, как данные в вопросе были отредактированы, чтобы удалить некоторые пробелы между двумя последними столбцами, следующее также будет выполнять эту работу:

cut -d ']' -f 3 file.txt

или просто

sed 's/.*]//' file.txt

или

awk -F ']' '{ print $3 }' file.txt
0
05.03.2020, 17:19
2 ответа

Если вы просто хотите, чтобы строка «TLR» вашего ввода была той же длины после обработки, что и раньше, это будет:

awk '/H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1'

и окончательное решение, учитывая, что теперь мы знаем, что у вас есть окончания строк DOS и вы хотите их сохранить:

awk -v ORS='\r\n' '{sub(/\r$/,"")} /H ICOC/{cnt++} /^TLR/{$0=sprintf("%-*s", length(), "TLR"(cnt+0))} 1' file
2
28.04.2021, 23:21
awk '/H ICOC/{cnt++} /^TLR/ {$0 = sprintf("TLR%-39d", cnt)} 1' file
0
28.04.2021, 23:21

Теги

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