awk通过带有不同分隔符计数的文本文件到数组中

时间:2017-05-28 22:32:12

标签: arrays bash awk

我有一个有8000行的文本文件,这是一个例子

  

00122; IL;芝加哥;路由器;; 1496009459

     

00133; IL;芝加哥;路由器; 0; 6.651; 1496009460

     

00166; IL;芝加哥;路由器; 0; 5.798; 1496009460

     

00177; IL;芝加哥;路由器; 0; 5.365; 1496009460

     

00188; IL;芝加哥;路由器; 0; 22.347; 1496009460

正如您所看到的,文件具有不同的分隔符数,我需要插入所有以';'分隔的列无论何时出现分隔符,都要到数组 所以第一行将有6个字段,第二行将有7个字段。

当我尝试通过以下命令执行此操作时 Number =($(awk'{print $ 1}'$ FileName.txt))每个列都有不同的数组名称和字段,我得到了一些奇怪的行为,当我在一行中回显所有字段时,并非所有字段都打印出来

性能非常重要(需要在几秒钟内完成)我发现使用awk是目前为止最快的方法,除非有人有更好的方法。 想法为什么会这样?

1 个答案:

答案 0 :(得分:0)

要将整个文本文件转储到数组中,我将使用以下内容。在此示例中,我们使用两个数组${finalarray[]}${subarray[]}(尽管后者未设置)和变量$line。我们假设文件名为file.txt

#!/bin/bash
finalarray=()
while read line; do #For each cycle, the variable $line is the next line of the file
    if [[ -z $line ]]; then continue; done #If the line is empty, skip this cycle
    IFS=";" read -r -a subarray <<< "$line" #Split $line into ${subarray[]} using : as delim
    finalarray+=( "$subarray[@]}" ) #Add every element from ${subarray[]} to ${finalarray[]}
    unset subarray #clears the array
done <file.txt

如果您的空行实际上是由空格或其他空格字符填充的,那么空行捕获将无法正常工作。相反,你可以使用类似下面的内容来跳过任何不包含分号的行。

if [[ $(echo "$line" | grep -c ";") -eq 0 ]]; then continue; fi

另一方面,这将跳过所有行而不使用分号,即使您打算将其中一些行作为单个数组条目。