Объедините два файла CSV на основе совпадающих данных столбца

Нет, вам не нужно повторно импортировать ключи

Они будут действительны, пока не будут удалены из файла .ssh/authorized_keys.

Если ваш pam-ldap настроен на отключение пользователя по истечении срока действия пароля, вы не сможете войти с ключом, пока ваш пользователь не будет снова включен (смена пароля LDAP).

1
28.05.2019, 23:01
3 ответа

Это оказалось сложнее, чем я ожидал, но с инструментами из python -на базе csvkitверсии 1.0.2:

$ csvjoin -HI -c 6,1 --left File1.csv File2.csv 2>/dev/null | csvformat -K1 -U1
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"

(-Iкажется необходимым, чтобы csvjoinне догадался, что поля, разделенные точками -, являются датой и временем, по крайней мере, в моей локали.)

1
27.01.2020, 23:30
for i in `cat file2.csv | awk -F "," '{print $1}'| sed 's/"//g'`; do j=`sed -n '/'$i'/p' file2.csv| awk -F "," '{print $2}'| sed 's/"//g'`;awk -v i="$i" -v j="$j" -F "," '$NF==i{$7=j;print $0}' file1.csv; done| sed 's/ /","/g'| sed 's/^/"/g'| sed 's/$/"/g'

выход

"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
0
27.01.2020, 23:30

Вот одно из решений с использованием awk. Протестировано на GNU awk 4.1.3.

$ awk -F, 'NR==FNR{a[$1]=$2}NR!=FNR{print $0","(a[$6]?a[$6]:"\"\"")}' file2.csv file1.csv
"Z","P","W","K","1","1.18.24.59","23 25 41"
"S","K","D","X","9","1.14.19.238","8827 145 8291"
"R","M","P","Y","8","1.15.11.21","98 77 8291"
"B","D","0","U","5","1.9.20.159","283 1 5734"
"R","E","W","Q","6","135.0.0.1",""
"K","D","K","R","9","1.9.74.13","123 256 51"
$
  • NR==FNR{a[$1]=$2сопоставляет строки в файле2 и добавляет их в массив, введенный в поле #1.
  • Затем NR!=FNRсоответствует строкам в файле1.
  • print $0","выводит всю строку из файла1 с запятой.
  • (a[$6]?a[$6]:"\"\"")выводит соответствующее содержимое созданного ранее массива, но только "", если запись не найдена.
1
27.01.2020, 23:30

Теги

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