Я хочу добавить условие If в цикл while, чтобы проверить одну и ту же строку в каждой строке в 2 файлах и распечатать другие столбцы в файлах, если они совпадают

Содержимое в data.csv

[email protected] status
[email protected] status
[email protected] status 

Содержимое в data2.csv

[email protected] unique_user_id
[email protected] unique_user_id
[email protected] unique_user_id

Мой пример кода:

While read c1.f1 c2.f1 c1.f2 c2.f2;
Do 
Echo “$c2.f2 $c2.f1”
Done<paste data.csv data2.csv

Этот код напечатает мне значения во 2-х столбцах обоих файлов, но мне нужна какая-то проверка перед этим, например, добавление «оператора if», чтобы проверить, равны ли идентификаторы электронной почты пользователей в первых столбцах в обоих файлах, прежде чем печатать 2-й столбец. . Я хочу напечатать unique_user_id и статус только путем сопоставления идентификатора электронной почты. Могу ли я это сделать? Или я могу сделать это лучше с помощью команды awk и как лучше всего это сделать? Спасибо

Добавьте shebang, а затем вставьте туда свой скрипт: shellcheck.net

Cyrus 09.09.2018 20:45

К вашему сведению, CSV == значения, разделенные запятыми. В ваших файлах нет запятых :-)

Nic3500 09.09.2018 21:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот небольшой сценарий, который я придумал:

#!/bin/bash

# using your method
paste data.csv data2.csv | while read file1_email file1_value file2_email file2_value
do
    if [ "$file1_email" == "$file2_email" ]
    then
        echo "$file1_email, $file1_value, $file2_value"
    fi
done

echo "------------------------------------------"

# this is mine
while read file1_email file1_value
do
    file2_counter=$(grep -c $file1_email data2.csv)
    if [ $file2_counter -gt 0 ]
    then
        file2_line=$(grep $file1_email data2.csv)
        file2_value=$(echo $file2_line | awk '{print $2}')

        echo "$file1_email, $file1_value, $file2_value"
    fi
done <data.csv
  • Проблема с вашим подходом заключается в том, что он считает само собой разумеющимся, что адресные электронные письма всегда будут отображаться в одних и тех же строках в обоих файлах.
  • бывший. если для data2.csv применяется другая сортировка, он может иметь те же адреса электронной почты, что и data2.csv. Но команда paste ничего не сортирует, а просто отображает данные по мере их чтения.
  • Поэтому я придумал другой подход. Прочтите адрес электронной почты из data.csv, найдите в data2.csv, если он там есть, если да, извлеките значение из него и распечатайте все эти данные.

Если вы воспользуетесь моим методом, он будет перебирать каждую строку data.csv. Но data.csv должен быть "чистым", поскольку read предполагает 2 поля. Первый - это адрес электронной почты, второй - значение. Вам следует взглянуть на содержимое data.csv.

Затем время от времени он проверяет, присутствует ли электронное письмо, прочитанное из data.csv, в data2.csv. Если это не так, ничего не делается (нет else в if). Но если вы все равно хотите что-то сделать, добавьте else и немного кода.

Привет, Ник, Большое спасибо за быстрый ответ! Ваш метод работает для меня, но почему-то не хватает нескольких строк данных или идентификаторов электронной почты. Это связано с тем, что если в какой-либо строке не найден соответствующий шаблон, выполнение останавливается. как лучше всего решить эту проблему? Еще раз большое спасибо за вашу помощь в этом! :) @ Nic3500

kaushik 10.09.2018 01:52

Я добавил в ответ несколько комментариев.

Nic3500 10.09.2018 02:05

Другие вопросы по теме