Оболочка запускается, когда Вы входите в систему, но она также запускается программами как 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
, и это было то, куда Вы поместите свои определения псевдонима.
Так, короче говоря, приложение, которое порождает оболочку, добирается, чтобы решить, должно ли это быть "оболочкой входа в систему", в этом случае существует это '-'
вначале, или регулярная оболочка. В большинстве случаев оболочка, это будет интерактивным, запускается как оболочка входа в систему, и оболочка означала только выполнять некоторые команды, или поскольку аргументами или из сценария, и затем выходить является регулярная оболочка.
Но это - все до прихоти приложения, которое запускает оболочку.
]Попробуйте следующее:[
] [$ 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[
][]FNR == NR[
], каждый раз сохраняем обновленное время каждого идентификатора в ассоциативном массиве []u[
], ключ - это id, значение - время обновления. [] При чтении файла_2:[
] []$4[
] больше, чем соответствующее время обновления id в массиве []u[
] ([]$4 > u[$1][
]), мы вывешиваем строку и переходим к следующей строке. []t ~ $3[
], т.е. [] "2014-7-11" ~ "2014-7-11 12:00" [
], если верно, то распечатываем строку.[] Я предполагаю, что под 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, чтобы вычеркнуть время перед сравнением.[