Печать содержимого файла в определенном порядке в bash - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть два файла.Я выполняю некоторые действия на file1, который генерирует другой файл file2

Вот мой контент file1:

class parent {
   public void bye() {statement}   
   public void home1() {statement}
   public void Work() {statement}       
   public void apple() {statement}      
   public void fruits() {statement} 
  }

Вот мой произведенный файл file2:

parent
{
        void parent.<init>() (dex_method_idx=8)  {statement}
        void parent.Work() (dex_method_idx=13) {statement}       
        void parent.apple() (dex_method_idx=9) {statement} 
        void parent.bye() (dex_method_idx=10) {statement} 
        void parent.fruits() (dex_method_idx=11) {statement} 
        void parent.home1() (dex_method_idx=12) {statement} 
}

Сгенерированный файл2, имеющий фиксированный шаблон.Первый код функции всегда будет начальным абзацем.Затем он напечатает код функции, который начинается с заглавной буквы (напр. Работа).Затем распечатайте оставшийся код функции в алфавитном порядке.

Как можно распечатать код функции file2 в соответствии с порядком file1 кода функции.Ожидаемый результат:

parent
{
        void parent.<init>() (dex_method_idx=8)  {statement}    
        void parent.bye() (dex_method_idx=10) {statement} 
        void parent.home1() (dex_method_idx=12) {statement}
        void parent.Work() (dex_method_idx=13) {statement}       
        void parent.apple() (dex_method_idx=9) {statement} 
        void parent.fruits() (dex_method_idx=11) {statement}        
}

Пожалуйста, предложите мне подход.

Ответы [ 4 ]

0 голосов
/ 06 февраля 2019

Другой способ с awk:

awk -vl=1 '
NR==FNR {
if ($3 ~ /[(][)]$/) {
    a[$3]=++j
    }
next
}
{ split($2,e," ") }
!(e[1] in a) {
  print
  next
}
{
  d[a[e[1]]]=$0
  while ( d[l] != "" ) {
    print d[l]
    l++
    }
  }
' file1 FS=\. file2
0 голосов
/ 05 февраля 2019

Я не знаю вариаций ваших входных файлов.Это решение работает с вашими примерами.

Требуется поиск функций из файла 1.

grep -o "[^ ]*()"  file1

Первые 3 строки и последняя строка являются специальными.
Объедините их с

sed -n '1,3 p' file2
grep -f <(grep -o "[^ ]*()"  file1) file2
sed -n '$ p' file2
0 голосов
/ 06 февраля 2019

Когда я выполняю приведенный выше код, он отображает только содержимое файла1
Он не отображает вышеуказанный вывод

Это может быть связано с наличием пре-POSIX awk, которыйне знает классов символов ([:alnum:], [:space:]).Вот версия сценария Эда Мортона без классов персонажей:

BEGIN { FS="[ .]+" }
NR==FNR {
    if (/^ *} *$/) inDefs=0
    if (inDefs) map[$4] = $0
    if (/^ *{ *$/) inDefs=1
    next
}
FNR==1 {
    print $2 ORS "{"
    print map["<init>()"]
    next
}
{ print $4 in map ? map[$4] : $0 }
0 голосов
/ 05 февраля 2019
$ cat tst.awk
BEGIN { FS="[^[:alnum:]_]+" }
NR==FNR {
    if (/^[[:space:]]*}[[:space:]]*$/) { inDefs=0 }
    if (inDefs) { map[$4] = $0 }
    if (/^[[:space:]]*{[[:space:]]*$/) { inDefs=1 }
    next
}
FNR==1 {
    print $2 ORS "{"
    print map["init"]
    next
}
{ print ($4 in map ? map[$4] : $0) }

$ awk -f tst.awk file2 file1
parent
{
        void parent.<init>() (dex_method_idx=8)  {statement}
        void parent.bye() (dex_method_idx=10) {statement}
        void parent.home1() (dex_method_idx=12) {statement}
        void parent.Work() (dex_method_idx=13) {statement}
        void parent.apple() (dex_method_idx=9) {statement}
        void parent.fruits() (dex_method_idx=11) {statement}
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...