从csv字段中提取表达式

时间:2017-05-22 08:14:28

标签: bash csv awk sed

我正在尝试提取CSV文件中word=之后的值,如下所示:

1473228800,0.0,word=google.sentence=Android.something=not_set
1480228800,100.0,word=google_analytics.number=not_set.country=US.source=internet
1493228800,0.0,location=NY.word=Android.sentence=not_set.something=not_set.type=gauge

我需要的输出是(对我来说非常重要的是打印“word”及其价值):

1473228800,0.0,word=google
1480228800,100.0,word=google_analytics
1493228800,0.0,word=Android

我尝试使用sedawk,但每个人只给了我很少的csv文件。 这是我最后一次尝试使用awk

awk -F "," '{sub(/.*word.*=(.*)\.*/,"word=\1", $3);print $1","$2","$3}'

2 个答案:

答案 0 :(得分:1)

awk 解决方案:

awk -F, '{match($3,/word=[^.]+/); print $1,$2,substr($3,RSTART,RLENGTH)}' OFS=',' file

输出:

1473228800,0.0,word=google
1480228800,100.0,word=google_analytics
1493228800,0.0,word=Android
  • match($3,/word=[^.]+/) - 匹配第3个字段中所需的序列

  • substr($3,RSTART,RLENGTH) - 从第3个字段中提取匹配的序列

  

match()函数将预定义变量 RSTART 设置为   指数。它还将预定义变量 RLENGTH 设置为长度   匹配子字符串的字符。

答案 1 :(得分:1)

尝试:

List<UserAccountViewModel>

将字段分隔符设为,然后用字符串字替换&gt; 8word。然后从DOT替换为$ 3中的NULL,因为我们根据您的问题不需要它。然后打印第一个,第二个和第三个字段,将输出字段分隔符设置为逗号。