Заменить третий столбец во всех строках файла в оболочке - PullRequest
0 голосов
/ 22 января 2019

У меня есть файл, содержащий около 60 столбцов данных. Файл также содержит около 80 миллионов записей. Мне нужна команда bash, чтобы заменить третий столбец на «20190113». Как мы определяем, что это третий столбец? Он ограничен непечатным символом '\ 001'

Замените третье поле во всех записях данных в файле, ограниченном специальным символом '\ 001' значением '20190113;

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Это может сработать для вас (GNU sed):

sed 's/[^[.\d1.]]*/20190113/3' file

Это заменяет третье вхождение тех символов, которые не соответствуют \001, строкой 20190113 в каждой строке файла.

0 голосов
/ 22 января 2019

Не так элегантно, как awk, но вот метод с sed.

a=$(printf "1\0012\0013\0014\0015")
# check
echo "$a" | hexdump -c
b=$(echo "$a" | sed -r 's/([^\x01]*\x01[^\x01]*\x01)[^\x01]*[^x01]/\120190113\x01/')
# check
echo "$b" | hexdump -c
0 голосов
/ 23 января 2019

Вы можете использовать шестнадцатеричный формат "\ xdd", чтобы указать разделители для awk. Просто установите разделители ввода и вывода в разделе BEGIN.

$ cat -v brian.txt
abc^Axyz^Afoo
def^Awvu^Abar

$ awk ' BEGIN{ FS=OFS="\x01"} { $3="20190113"; print } ' brian.txt
abcxyz20190113
defwvu20190113

$ awk ' BEGIN{ FS=OFS="\x01"} { $3="20190113"; print } ' brian.txt | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113

$

Вы также можете попробовать с Perl

$ perl -F"\x01" -lane ' $F[2]="20190113"; print join("\x01",@F) ' brian.txt
abcxyz20190113
defwvu20190113

$ perl -F"\x01" -lane ' $F[2]="20190113"; print join("\x01",@F) ' brian.txt | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113

$
0 голосов
/ 22 января 2019

awk может обрабатывать непечатаемые символы, в том числе \001.

$ cat -v test.in
abc^Axyz^Afoo
def^Awvu^Abar
$ awk '{$3 = "20190113"}1' FS=$'\1' OFS=$'\1' test.in | cat -v
abc^Axyz^A20190113
def^Awvu^A20190113

$'…' - это конструкция, поддерживаемая большинством оболочек, которая позволяет использовать escape-символы.^A представляет символ \001;-v говорит cat напечатать это вместо буквального непечатного \001 байта.

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