Установка множителей вне порядка переменных с шаблоном - PullRequest
1 голос
/ 28 марта 2019

У меня есть файл в следующем формате (обратите внимание, что в некоторых строках переменные инвертированы, в примере, строка 3):

var1: valueA var2: valueB
var1: valueC var2: valueD
var2: valueF var1: valueE
var1: valueG var2: valueH

И я пытаюсь использовать awk для вывода на печатьв формате (var1 | var2):

valueA|valueB
valueC|valueD
valueE|valueF
valueG|valueH

Я пытался разделить и установить значение на основе таких шаблонов, как это:

$ awk -v OFS='|' '{split($0,a," ")} /^var1:/{var1=a[2]} /^var2:/{var2=a[2]} {print var1, var2}' test.txt
valueA|
valueC|
valueC|valueF
valueG|valueF

Но все попытки, которые я сделал, заканчивалисьс отсутствующими результатами или дублированными значениями.Есть ли способ установить и распечатать переменные на основе имен переменных (шаблонов)?

Ответы [ 4 ]

2 голосов
/ 28 марта 2019

Каждый раз, когда у вас есть пары имя = значение, как у вас, лучше сначала создать массив этих пар (f[] ниже), а затем вы можете просто получить доступ к значениям по их именам, например:

$ awk -F'[: ]+' -v OFS='|' '{for (i=1;i<NF;i+=2) f[$i]=$(i+1); print f["var1"], f["var2"]}' file
valueA|valueB
valueC|valueD
valueE|valueF
valueG|valueH
1 голос
/ 28 марта 2019

Это не лучший ответ, но это весело:

grep -oP '\w+:\s+(.*?)(?=\s+\w+:|$)' file |
  sort --stable -t: -k1,1 | 
  cut -d" " -f2- | 
  pr -2T -s"|"
0 голосов
/ 28 марта 2019

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

perl -lne ' %kv=/(var\S+)\s+(\S+)/g; for(sort keys %kv) 
            { printf("%s%s",$s,$kv{$_}); $s="|"  } print "";$s="" ' file

с заданными вами значениями

$ cat ajk.txt
var1: valueA var2: valueB
var1: valueC var2: valueD
var2: valueF var1: valueE
var1: valueG var2: valueH

$ perl -lne ' %kv=/(var\S+)\s+(\S+)/g; for(sort keys %kv) 
      { printf("%s%s",$s,$kv{$_}); $s="|"  } print "";$s="" ' ajk.txt
valueA|valueB
valueC|valueD
valueE|valueF
valueG|valueH

$
0 голосов
/ 28 марта 2019

, пожалуйста, попробуйте выполнить следующее.

awk '
match($0,/var1: [^ ]*/){
   val=substr($0,RSTART+6,RLENGTH-6)
   match($0,/var2: [^ ]*/)
   print val"|"substr($0,RSTART+6,RLENGTH-6)
}'  Input_file

ИЛИ (поскольку первый код будет иметь ограничение, он будет искать val1 должна присутствовать как строка, так и строка val2, чтобы избежатьчто можно попробовать):

awk '
match($0,/var1: [^ ]*/){
   val=substr($0,RSTART+6,RLENGTH-6)
}
match($0,/var2: [^ ]*/){
   print val"|"substr($0,RSTART+6,RLENGTH-6)
}'  Input_file

Вывод будет следующим.

valueA|valueB
valueC|valueD
valueE|valueF
valueG|valueH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...