Файлы CSV слияния с условиями

Оболочка запускается, когда Вы входите в систему, но она также запускается программами как make, или когда Вы выполняете сценарий оболочки, или когда Вы вводите :sh кому: vi, или когда Вы создаете новое окно терминала.

Первоначально, чтение оболочки в ~/.profile когда Вы вошли в систему или работали su. Этот сценарий сделал бы, вещам нравится, объявляют, была ли у Вас новая электронная почта, настройте свое стирание и уничтожьте символы, и установите и экспортируйте ТЕРМИН и СОЕДИНИТЕ переменные каналом. При запуске почти в любом другом контексте оболочка не читала ~/.profile, потому что выполнение большинства тех вещей было бы избыточно. Вы, как ожидали, экспортируете любые важные переменные оболочки в новую оболочку.

Путем оболочка знала, читать ли в ~/.profile должен был проверить ли первый символ argv[0], иначе $0, был '-'.

Запуск с csh, псевдонимы были представлены. Псевдонимы не экспортировались в среде. csh был разработан для чтения в двух различных сценариях инициализации. ~/.login было только для чтения, когда пользователь вошел в систему, и сигнал, чтобы сделать, это было то, если argv[0] начался '-'. ~/.cshrc был считан каждый раз, когда оболочка была запущена. В целом, помещенный псевдоним в ~/.cshrc и все остальное в ~/.login. csh также поддерживаемый ~/.logout, который в большинстве случаев просто очистил экран и работал fortune.

Другие оболочки приняли эти те же функции. ksh читал бы в ~/.kshrc, bash читал бы в ~/.bashrc, и это было то, куда Вы поместите свои определения псевдонима.

Так, короче говоря, приложение, которое порождает оболочку, добирается, чтобы решить, должно ли это быть "оболочкой входа в систему", в этом случае существует это '-' вначале, или регулярная оболочка. В большинстве случаев оболочка, это будет интерактивным, запускается как оболочка входа в систему, и оболочка означала только выполнять некоторые команды, или поскольку аргументами или из сценария, и затем выходить является регулярная оболочка.

Но это - все до прихоти приложения, которое запускает оболочку.

2
11.07.2014, 16:49
2 ответа
[

]Попробуйте следующее:[

] [
$ awk -F',' -v t="$(date +"%Y-%-m-%-d")" '
    FNR == NR {
        u[$1] = $4;
        next;
    }
    $4 > u[$1] {
        print;
        next;
    }
    t ~ $3
' file_1 file_2
] [

][]Объяснение[][

] [
    ] [
  • ]Получим сегодняшнюю дату, сохраним ее в переменной []t[][
  • ] [
  • ]При чтении файла_1 []FNR == NR[], каждый раз сохраняем обновленное время каждого идентификатора в ассоциативном массиве []u[], ключ - это id, значение - время обновления. [
  • ] [
  • ][

    ] При чтении файла_2:[

    ] [
      ] [
    • ] Если дата обновления id, []$4[] больше, чем соответствующее время обновления id в массиве []u[] ([]$4 > u[$1][]), мы вывешиваем строку и переходим к следующей строке. [
    • ] [
    • ]Если вышеприведенное условие ложно, то мы проверяем, является ли дата создания текущей строки сегодня, []t ~ $3[], т.е. [] "2014-7-11" ~ "2014-7-11 12:00" [], если верно, то распечатываем строку.[
    • ] [
    ][
  • ] [
]
3
27.01.2020, 21:57
[

] Я предполагаю, что под csv_date_x вы подразумеваете csv_2014_4_15, а csv_date_x+1 означает csv_2014_4_16. Но в соответствии с вашим псевдокодом вы никогда не используете никаких строк из csv_date_x, так что это скорее фильтр, чем слияние, и вы получаете подмножество csv_2014_4_16.[

] [

]Это нетривиальная задача программирования, но я могу указать вам в выгодном направлении.[

] [

]Такие вещи могут стать волосатыми, если вам придется иметь дело с экранированными запятыми в первых двух полях. Я предполагаю, что это не так.[

] [

]Я также предполагаю, что вы можете сравнивать эти два файла ряд за рядом, так как вы не указали.[

] [

]Сначала вам нужно нормализовать ваши csv-файлы так, чтобы месяцы и даты всегда состояли из двух цифр (ведущие нули). Затем их можно сравнить в текстовом виде, и это довольно просто с помощью []awk[]. Что-то вроде:[

] [
sed 's/-\([1-9]\)/-0\1/'
] [

](это предполагает, что у вас нет дефисов в именах, идентификаторах или "других столбцах", вам понадобится другой подход, если это так, возможно, более тщательное сравнение по шаблонам дат и, возможно, ограничение по 3-му и 4-му полям). [

] [

] Используйте программу [] date[], чтобы сгенерировать сегодняшнюю дату в выходном формате, который соответствует вашим полям, и передайте ее в качестве переменной для []awk[], чтобы использовать:[

] [
awk -v Today=$(date +"%Y-%m-%d %H:%M") -v File1=csv_2014_4_15 -v File2=csv_2014_4_16 '
{ getline line1 < File1;
  getline line2 < File2;
  split(line1, f1, ",");
  split(line2, f2, ",");
}
f1[1] == f2[1] { ...; next } # compare IDs this is your first 'if' clause
{ ... } # this is your else clause since the previous ended with "next"
] [

] Вы находитесь в довольно хорошей форме в этот момент. f1 содержит поля строки из File1, а f2 содержит поля строки из File2. Вы можете сравнить идентификаторы (например, f1[1] и f2[1]) и даты (например, f1[2] для создания f1[3] для обновления). и распечатать нужные вам строки. Вы можете сравнить с []Today[] для сегодняшней даты.[

] [

]Обратите внимание, что вы можете стать более причудливым и сделать нормализацию формата данных в пределах []awk[], разделив 3-е и 4-е поля на []-[], но мне будет проще сначала с помощью []sed[].[

] [

]Также обратите внимание, что Today содержит как дату, так и время. Если вы просто хотите сравнить дату, вы можете вычеркнуть ее из спецификации команды []date[], но вам также нужно разделить поле csv, чтобы вычеркнуть время перед сравнением.[

].
2
27.01.2020, 21:57

Теги

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