Проверьте на и добавьте, пропустив метки времени к отдельным строкам в файле

Если Вы запускаете kde от xinit команда, Вы могли установить следующие переменные среды в ~/.xinitrc,

export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus

Это заставит все программы уважать ibus. (Если это не работает на Вас, изменить startkde4 напишите сценарий непосредственно, добавьте эти 3 строки к вершине его, после #!/bin/sh

И также автоматический запуск ibus программы, ibus-daemon -xd , установите это в systemsettings , существует что-то названное "Запуск", не может помнить точное имя

4
07.07.2013, 02:46
3 ответа

Это awk должен сделать это:

awk '{ 
         if ( $NF ~ /[0-9]+:[0-9]+:[0-9]+/ ) {
            lasttime = $NF
            print
         } else {
            print $0, lasttime
         }
     }' < myfile.txt
4
27.01.2020, 20:52

Вот решение для удара в случае, если это имеет значение. Это действительно использует сингл awk, но это могло, вероятно, быть пересмотрено в случае необходимости:

while read line ; do
  ncol=$(echo "$line" | awk '{print $NF}')
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "$line"
    continue
  fi
  echo "$line $tmstmp"

done < 82031.txt

Файл 82031.txt включает следующее:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213
ABCD ASADSADSFSSDSSD 09:24:50

Выполнение вышеупомянутого сценария производит следующее:

ABCD 01206001022T01YA022T01YA022T07SO 09:20:38
ABCD 01206001022ACION 09:24:40
ABCD 04006001021S01UK 09:24:42
ABCD 7878696621321312 23213213213213 09:24:42
ABCD ASADSADSFSSDSSD 09:24:50

чистое решение для Bash

Вот альтернатива, которая использует только Bash. Вместо использования awk для вытаскивания последнего столбца из строки входа из .txt файла мы используем Bash read команда на while цикл. Опции -ra отключите обратные косые черты от того, чтобы быть символом ESC (-r) и -a разделяет вход с помощью $IFS разделитель, помещая каждую ценность атомов текста в элемент в массиве ${line[@]}.

while IFS=" " read -ra line ; do
  ncol="${line[@]: -1:1}"
  if [[ "$ncol" == *:*:* ]]; then
    tmstmp="$ncol"
    echo "${line[@]}"
    continue
  fi
  echo "${line[@]} $tmstmp"

done < 82031.txt

Этот бит, ${line[@]: -1:1} вытаскивает последний столбец массива ${line[@]}.

2
27.01.2020, 20:52
  • 1
    Используя read -a читать в массив, а не строку было бы способом устранить вызов к awk. –  jordanm 07.07.2013, 06:04
  • 2
    @jordanm - спасибо я добавил пример с помощью подсказки. –  slm♦ 07.07.2013, 10:34

Еще одно решение для удара

[[ ! -f $1 ]] && { echo -e "\tUsage:\t\n\t\t$0\t<input_file>\n"; exit 1; }

while read -ra line;
do
        if [[ ${line[@]} =~ [0-9]+:[0-9]+:[0-9]+ ]]; then
                echo ${line[@]}
                lasttime=${line[@]: -1:1}
        else

                echo ${line[@]} $lasttime
        fi
done < $1
0
27.01.2020, 20:52

Теги

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