Использованиеawk
:
awk '{print substr($18,1,12)}' input
Это напечатает символы 1 -12 столбца 18. Это предполагает, что ваш текстовый файл разделен пробелами. Что, скорее всего, не так.
Для CSV:
awk -F, '{print substr($18,1,12)}' input
На основе комментария Steeldriver о добавлении этого вывода в новый столбец:
awk '{$(NF+1) = substr($18,1,12)} 1' input > output
К сожалению, при этом создается новый файл. gawk
может изменить файл на месте, но лучше всего создать новый файл, а затем удалить старый.
Вам просто нужно изменить a[$1] = $2
на a[$2] = $1
, поэтому:
awk 'NR == FNR{ a[$2] = $1; next }; { print $1, $1 in a?a[$1]: "0" }' file2 file1
Однако это можно сократить до:
awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' file2 file1
Обновление:Для чтения входных данных из вывода команд cmdX и cmdY .
awk 'NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }' <(cmdY) <(cmdX)
если используемая вами оболочка не поддерживает процесс -Замена :, вы можете сделать следующее:
( cmdY | ( cmdX | (
awk '
NR == FNR{ a[$2] = $1; next } { print $1, a[$1]+0 }
' /dev/fd/3 /dev/fd/4 ) 4<&0 ) 3<&0 )
Утилита join
может сопоставлять совпадения, но требуется второй проход и printf
форматирование, чтобы сопоставить промахи, а затем напечатать0
:
join -2 2 file{1,2} ; printf '%s 0\n' $(join -v 1 -2 2 file{1,2})
Примечание:join
предполагает, что оба файла сортируются в одном и том же порядке.