Текст переупорядочивания на каждой строке в файле

если Вы не произвели новую строку уже (e, g: используемый-n в команде эха), команде:

echo -e "\r\033["

добьется цели.

2
11.11.2014, 01:24
5 ответов

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

 awk '{print $4,$5,$6,$7,$8,$9,$1,$2,$3}' log_file

Вы можете сделать это непосредственно от вас файл журнала:

awk '{printf("<wpt %s%s\"%s\" %s%s\"%s\">\n<time>%s %s %s</time>\n</wpt>\n",$4,$5,substr($6,0,length($6)),$7,$8,$9,$1,$2,$3)}' log_file

Вывод:

<wpt lat="41.858657" lon="-91.345142">
<time>11-06-2014 - 10:49:06PM</time>
</wpt>
<wpt lat="42.864653" lon="-92.349914">
<time>11-06-2014 - 10:49:49PM</time>
</wpt>
<wpt lat="43.874808" lon="-93.350364">
<time>11-06-2014 - 10:50:35PM</time>
</wpt>
<wpt lat="44.885047" lon="-94.350058">
<time>11-06-2014 - 10:51:21PM</time>
</wpt>
<wpt lat="45.895078" lon="-95.349920">
<time>11-06-2014 - 10:52:08PM</time>
</wpt>
<wpt lat="46.905178" lon="-96.349837">
<time>11-06-2014 - 10:53:30PM</time>
</wpt>
<wpt lat="47.910303" lon="-97.350606">
<time>11-06-2014 - 10:54:50PM</time>
</wpt>
5
27.01.2020, 21:49

первая часть вашей перестройки может быть выполнена довольно легко, если состав данных одинаков и не изменяется.

cat myfile | while read line
do
  latlong=$(echo ${line} | cut -d " " -f 4-)
  datetime=$(echo ${line} | cut -d " " -f 1-3)
  echo ${latlong}" "${datetime} >> mynewlyformattedfile
done

это можно сделать более подробно на одной линии, используя sed и/или awk я уверен, но я пытался сделать это таким образом, чтобы показать, что происходит в какой пункт.

с помощью команды cut можно извлечь любую часть строки и повторить ее с любым префиксом/суффиксом, чтобы довольно легко создать файл xml.

-121--117824-

с помощью awk:

 awk '{print $4,$5,$6,$7,$8,$9,$1,$2,$3}' log_file

вы можете сделать это непосредственно из файла журнала, как это:

awk '{printf("<wpt %s%s\"%s\" %s%s\"%s\">\n<time>%s %s %s</time>\n</wpt>\n",$4,$5,substr($6,0,length($6)),$7,$8,$9,$1,$2,$3)}' log_file

вывод:

<wpt lat="41.858657" lon="-91.345142">
<time>11-06-2014 - 10:49:06PM</time>
</wpt>
<wpt lat="42.864653" lon="-92.349914">
<time>11-06-2014 - 10:49:49PM</time>
</wpt>
<wpt lat="43.874808" lon="-93.350364">
<time>11-06-2014 - 10:50:35PM</time>
</wpt>
<wpt lat="44.885047" lon="-94.350058">
<time>11-06-2014 - 10:51:21PM</time>
</wpt>
<wpt lat="45.895078" lon="-95.349920">
<time>11-06-2014 - 10:52:08PM</time>
</wpt>
<wpt lat="46.905178" lon="-96.349837">
<time>11-06-2014 - 10:53:30PM</time>
</wpt>
<wpt lat="47.910303" lon="-97.350606">
<time>11-06-2014 - 10:54:50PM</time>
</wpt>
-121--117821-

Вы можете использовать

perl -lane 'print "@F[2..$#F] $F[0] $F[1]"' log_file

для разворота строк журнала.

4
27.01.2020, 21:49
sed '   s/ *[=;]"* */="/g;s//" /2         #first sub-out spaces; for "
        s|\(.*M\) \(.*\)|\                #then do the replace
<wpt \2">\
        <time>\1</time>\
</wpt>|
' <<\INPUT
11-06-2014 - 10:49:06PM lat = 41.858657; lon = -91.345142
11-06-2014 - 10:49:49PM lat = 42.864653; lon = -92.349914
11-06-2014 - 10:50:35PM lat = 43.874808; lon = -93.350364
11-06-2014 - 10:51:21PM lat = 44.885047; lon = -94.350058
11-06-2014 - 10:52:08PM lat = 45.895078; lon = -95.349920
11-06-2014 - 10:53:30PM lat = 46.905178; lon = -96.349837
11-06-2014 - 10:54:50PM lat = 47.910303; lon = -97.350606
INPUT

Это то, с чем я придумал. Это довольно просто в SED . Я использую буквальные персонажи здесь, потому что мне проще прочитать и потому, что не все SED будет обрабатывать обратную косание ускорки в правом поле замены руки. Если у вас есть, то не стесняйтесь. В любом случае, определенно эти встроенные комментарии будут поднять любой SED , так что выньте их перед тестированием.

Выход

<wpt lat="41.858657" lon="-91.345142">
        <time>11-06-2014 - 10:49:06PM</time>
</wpt>

<wpt lat="42.864653" lon="-92.349914">
        <time>11-06-2014 - 10:49:49PM</time>
</wpt>

<wpt lat="43.874808" lon="-93.350364">
        <time>11-06-2014 - 10:50:35PM</time>
</wpt>

<wpt lat="44.885047" lon="-94.350058">
        <time>11-06-2014 - 10:51:21PM</time>
</wpt>

<wpt lat="45.895078" lon="-95.349920">
        <time>11-06-2014 - 10:52:08PM</time>
</wpt>

<wpt lat="46.905178" lon="-96.349837">
        <time>11-06-2014 - 10:53:30PM</time>
</wpt>

<wpt lat="47.910303" lon="-97.350606">
        <time>11-06-2014 - 10:54:50PM</time>
</wpt>
2
27.01.2020, 21:49

Попробуйте это

find / -type f -perm /111 -print

или:

find / -type f -executable -print
-121--244739-

Первая часть вашей перестановки может быть сделана довольно легко, пока состав данных одинаково и не изменяется.

cat myfile | while read line
do
  latlong=$(echo ${line} | cut -d " " -f 4-)
  datetime=$(echo ${line} | cut -d " " -f 1-3)
  echo ${latlong}" "${datetime} >> mynewlyformattedfile
done

Это может быть сделано более подробно на одной строке, используя SED и / или awk, я уверен, но я пытался сделать это таким образом, чтобы показать, что происходит в какой момент.

Используя команду CUT , вы можете извлечь любую часть строки и эхо с любым префиксом / суффиксом, чтобы довольно легко создавать свой XML-файл.

1
27.01.2020, 21:49

То же самое для SED

sed -E 's&(.*M)( .*);( .*)$&<wpt\2\3>\n\t<time>\1</time>\n</wpt>&;
        $!G;
        s& = ([-.0-9]+)&="\1"&g' log.file

или поместите его в сценарий

#!/bin/sed -Ef
s|(.*M)( .*);( .*)$|<wpt\2\3>\n\t<time>\1</time>\n</wpt>|
$!G
s| = ([-.0-9]+)|="\1"|g

и используйте его

sed -Ef script.file log.file

или если сделали его исполняемым исполнением Chmod + x ./script.file Просто

./script.file log.file
1
27.01.2020, 21:49

Теги

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