Условно замените линии файла1 с соответствующими строками файла2

Вы можете получить текущее время эпохи с помощью

date  "+%s"

Вы также можете преобразовать любой формат времени во время эпохи:

date -d "${MY_TIME}" "+%s"

И эти времена эпохи вы можете вычесть .

Имея строку с BarDate: 2017-11-31 в переменной LINE, вы можете извлечь дату, используя:

MY_TIME=$(echo $LINE | cut -d: -f2)
2
24.09.2018, 17:39
3 ответа
$ paste file1 file2 | awk -F '\t' '$1 == "X" { $1 = $2 } { print $1 }'
1
4
5
5
X
7

Команда pasteсоздаст вывод с разделителями табуляцией -

1       2
4       3
X       5
5       X
X       X
7       1

и сценарий awkпросто устанавливает первое поле, разделенное табуляцией, на содержимое второго поля, если первое является символом X, а затем печатает первое поле (, теперь возможно измененное ).

Другой подход , предложенный glenn jackman , который не изменяет входящие данные, а просто выбирает поле для печати в зависимости от данных в первом столбце:

$ paste file1 file2 | awk -F '\t' '{ print $1 == "X" ? $2 : $1 }'

Использование GNUsed:

$ paste file1 file2 | sed -E -e '/^X/s/^[^\t]+\t//' -e 's/\t.*$//'
1
4
5
5
X
7

Два sedвыражения делают следующее:

  1. Если текущая строка начинается с X, то первая замена удаляет все до первого символа табуляции включительно. Это эффективно перемещает второй столбец вывода pasteв первый столбец, если первый столбец является X.
  2. Второе выражение удаляет символ табуляции и все после него. Это удаляет данные, которые нам не интересны.
2
27.01.2020, 21:55

С ударом

while IFS= read -r -u3 f1; IFS= read -r -u4 f2; do
    [[ $f1 == X ]] && echo "$f2" || echo "$f1"
done 3<file1 4<file2

или, в более общем смысле, POSIX

while IFS= read -r f1 <&3; IFS= read -f f2 <&4; do
    [ "$f1" = X ] && echo "$f2" || echo "$f1"
done 3<file1 4<file2
0
27.01.2020, 21:55

Если файл file2 помещается в памяти, вы можете использовать awk. Пусть он сначала прочитает в файле2, затем, когда он обрабатывает файл1, если он увидит «X», замените его из массива файл2:

$ awk 'NR == FNR { lines[NR]=$0; } NR != FNR { if ($0 == "X") print lines[FNR]; else print $0 }' file2 file1

Re -отформатировано, это:

$ awk 'NR == FNR { lines[NR]=$0; } 
       NR != FNR { if ($0 == "X") print lines[FNR]; 
                   else           print $0 
                 }' file2 file1

Обратите внимание, что файл2 — это первое имя файла; file1 — это второе имя файла.

3
27.01.2020, 21:55

Теги

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