用模式设置无序的倍数变量

时间:2019-03-28 17:39:56

标签: regex bash awk

我有一个以下格式的文件(请注意,有些行的变量在第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 个答案:

答案 0 :(得分:2)

每次像您一样拥有name = value对时,我发现最好首先创建一个由这些配对组成的数组(下面的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 :(得分:1)

这不是一个更好的答案,但这很有趣:

grep -oP '\w+:\s+(.*?)(?=\s+\w+:|$)' file |
  sort --stable -t: -k1,1 | 
  cut -d" " -f2- | 
  pr -2T -s"|"

答案 2 :(得分:0)

请您尝试以下。

data <- reactive({
  inFile <- input$file1
  if(!is.null(inFile)) {
     read.csv(inFile$datapath, header = TRUE, stringsAsFactors = FALSE)    
  }
})

dat <- data()
dat$X <- as.Date(dat$X)
dat <- dat[-5,]
dat$Y <- dat$Y * 10

output$plot1 <- renderPlot({    
  plot(dat$X, dat$Y)
})

OR(因为第一个代码会有局限性,所以它将查找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

答案 3 :(得分:0)

使用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

$