如何使用AWK基于当前列值打印其他行

时间:2017-07-03 08:43:59

标签: awk

我有一个包含以下内容的txt文件:

Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 128, 128, true);

并且基于第5列,我想使用AWK将所有值放在一列中。 “,”用于分隔数据。

结果将如下:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9,218e-9,136e-9,82e-9,82e-9,27e-9,0
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9,27e-9,0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9,27e-9,27e-9,0

3 个答案:

答案 0 :(得分:1)

awk 解决方案:

awk -F'[[:space:]]+|,' '{ for(i=5;i<=NF;i++) print $1,$2,$3,$4,$i }' file
  • -F'[[:space:]]+|,' - 将空格和逗号视为字段分隔符

  • for(i=5;i<=NF;i++) - 迭代第5个字段的项目

输出:

adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0

答案 1 :(得分:1)

另一个使用split的awk:

$ awk '{split($5,a,",");for(i in a) print $1,$2,$3,$4,a[i]}' file
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 82e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 27e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 0
adf8261:21:09:07 BAT SYNTAX_fa TRUE 273e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 218e-9
adf8261:21:09:07 BAT SYNTAX_fa TRUE 136e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 54e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 27e-9
qwe8261:21:09:10 BAT SYNTAX_fa TRUE 0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 0
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9
oiu8261:21:09:08 BAT SYNTAX_fa TRUE 27e-9

由于for(i in a),输出将按随机顺序排列。可以通过以下方式解决:

... n=split($5,a,","); for(i=1;i<=n;i++) print ...

答案 2 :(得分:0)

在这里尝试另外一种方法,我在考虑每行上你的Input_file中都存在字符串“TRUE”。

awk -F'TRUE[^0-9]*|,' '{for(i=2;i<=NF;i++){print $1,"TRUE",$i}}'   Input_file

说明:只需将字段分隔符设置为字符串TRUE直到第一个数字开始或将逗号作为字段分隔符(因此两个字段分隔符仅按照Input_file工作)。然后我通过for循环遍历第2个字段的字段到字段总数。现在打印第一个字段以及字符串TRUE,然后打印字段的值。最后提到了Input_file。