如何使用AWK将某些列从一个CSV文件提取到另一个?

野牛-Ex1

我有一个非常大的CSV日志文件,其中包含以下字段:

aaa=somedata1,bbb=somedata2,ccc=somedata3,eee=somedata5,hhh=somedata8
aaa=somedata1,ddd=somedata4,fff=somedata6,hhh=somedata8
aaa=somedata1,bbb=somedata2,hhh=somedata8,ggg=somedata9,jjj=somedata11

此文件的问题在于,当没有值时,生成设备甚至不包含“ fieldname =“,因此,由于缺少字段,CSV看起来很混乱(因此,每次字段丢失时,其余字段当前字段将被拖到CSV的左侧)。

我的想法是仅使用AWK提取某些相关的列,而且我需要将其输出到新的CSV中。

例如,在上面的示例中,我想提取包括字段“ aaa”和“ hhh”的所有列,以使新的CSV看起来像这样:

aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8

但是,我有两个问题:

  1. 我不知道如何在AWK中查找几种条件(我什至尝试将我需要的字段/关键字的名称写到TXT文件中,并在AWK中读取它,但我做不到)。
  2. 每次我尝试打印结果列时,新的CSV仅打印一个巨型列,而我似乎找不到一种打印列分隔的方法。

感谢任何帮助!

-编辑1-

是的,我尝试使用一些单独的AWK命令,如下所示:

awk '{for (i=1;i<=NF;i++) if ($i ~ /aaa/) { print $i}}' > aaa.csv
awk '{for (i=1;i<=NF;i++) if ($i ~ /hhh/) { print $i}}' > hhh.csv

然后尝试使用(当然,我总共有10个我有兴趣提取的不同列,但是出于简洁起见,我在示例中只添加了2个):

paste -d "," aaa.csv hhh.csv > Allcolumns.csv

----编辑2 ----

由于原始文件是一个日志,因此我总共要提取约10个相关的列,因此我确保所有行上都出现了哪些列,而我确实需要这些列。如果有可能它们没有出现在原始文件中,我想最好的做法是使最终文件反映诸如“ aaa,hhh ,, iii”之类的内容。

埃德·莫顿

每当您在数据中包含“标记=值”对时,我都会发现最好首先创建一个数组来保存该映射(tag2val[]如下所示),然后再按其标记(即名称或键)引用所有值。

在所有Unix机器的任何shell中使用任何awk:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
    numTags = split("aaa,hhh",tags)
}
{
    delete tag2val
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        tag2val[tag] = $i
    }

    for (i=1; i<=numTags; i++) {
        tag = tags[i]
        printf "%s%s", tag2val[tag], (i<numTags ? OFS : ORS)
    }
}

$ awk -f tst.awk file
aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8

如果要在每一行上打印所有可能的字段,那么这是一种两遍方法,其中第一遍只是识别每行中的所有可能字段:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
}
NR==FNR {
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        if ( !seen[tag]++ ) {
            tags[++numTags] = tag
        }
    }
    next
}
{
    delete tag2val
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        tag2val[tag] = $i
    }

    for (i=1; i<=numTags; i++) {
        tag = tags[i]
        printf "%s%s", tag2val[tag], (i<numTags ? OFS : ORS)
    }
}

$ awk -f tst.awk file file
aaa=somedata1,bbb=somedata2,ccc=somedata3,eee=somedata5,hhh=somedata8,,,,
aaa=somedata1,,,,hhh=somedata8,ddd=somedata4,fff=somedata6,,
aaa=somedata1,bbb=somedata2,,,hhh=somedata8,,,ggg=somedata9,jjj=somedata11

如果只想打印所有行中出现的字段,请执行以下操作:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
}
NR==FNR {
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        cnt[tag]++
    }
    next
}
FNR==1 {
    for (tag in cnt) {
        if ( cnt[tag] == (NR-1) ) {
            tags[++numTags] = tag
        }
    }
}
{
    delete tag2val
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        tag2val[tag] = $i
    }

    for (i=1; i<=numTags; i++) {
        tag = tags[i]
        printf "%s%s", tag2val[tag], (i<numTags ? OFS : ORS)
    }
}

$ awk -f tst.awk file file
hhh=somedata8,aaa=somedata1
hhh=somedata8,aaa=somedata1
hhh=somedata8,aaa=somedata1

如果字段顺序的输出很重要,例如,要保持输入顺序,则只需在第一个块中创建一个数组即可将递增计数映射到每个新标记,如下所示:

$ cat tst.awk
BEGIN {
    FS = OFS = ","
}
NR==FNR {
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        if ( !cnt[tag]++ ) {
            order[++totTags] = tag
        }
    }
    next
}
FNR==1 {
    for (i=1; i<=totTags; i++) {
        tag = order[i]
        if ( cnt[tag] == (NR-1) ) {
            tags[++numTags] = tag
        }
    }
}
{
    delete tag2val
    for (i=1; i<=NF; i++) {
        tag = $i
        sub(/=.*/,"",tag)
        tag2val[tag] = $i
    }

    for (i=1; i<=numTags; i++) {
        tag = tags[i]
        printf "%s%s", tag2val[tag], (i<numTags ? OFS : ORS)
    }
}

$ awk -f tst.awk file file
aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8
aaa=somedata1,hhh=somedata8

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据列中的条件将行从一个Google工作表提取到另一个

awk将模式从一个文件匹配到另一个文件

如何将特定列从一个csv文件复制到另一个csv文件?

Python:尝试将行从一个csv文件提取并输出到另一个csv文件

如何使用异步将数据从一个组件获取到另一个组件并等待

将二进制数据从一个文件读取到另一个文件

将数据从一个CSV导入到另一个CSV文件-如何?

使用PowerShell将列从一个csv文件复制到另一个

将凭证从一个文件读取到另一个文件

如何使用“ tar”命令将文件提取到另一个目录?

如何使用Java脚本将数据从一个本地html文件发送/获取到另一个本地html文件

如何使用python将某些csv文件列复制到另一个csv文件中?

使用按钮将TextField的值从一个类获取到另一个类

将数据从文件提取到另一个文件

如何使用python将一个csv文件附加到另一个

如何使用awk根据另一个文件的内容从文件中提取数据?

使用Powershell将整个列从一个CSV文件复制到另一个

如何使用awk从一个文件到另一个文件多次获取价值?

使用 sed 或 awk 将值从一个文件附加到另一个文件

如何使用 jquery ajax 将一个变量从一个 php 文件获取到另一个 php 文件

将某些字符从一个文件移动到另一个文件

如何使用dict()从一个文件到另一个python文件

使用批处理文件将数据从一个文本文件提取到另一个文本文件

如何将一列从 300GB 文件中提取到另一个文件

awk 根据匹配将列数据从一个文件输入到另一个文件

如何将列值从一个数据框中提取到另一个?

将数据从一个 DataFrame 提取到另一个

如何将变量从一个函数获取到另一个函数?

如何从一个文件中提取列并移动到另一个文件而不打印列?