BashScript:读取文件并进行处理

时间:2016-03-29 17:30:17

标签: linux bash shell awk terminal

我有一个这种结构的文件:

Text...
        A                          B                    C
        A1                   57,624,609,830           20.99
        A2                   49,837,119,260           20.90
        A3                      839,812,303           20.88
        A4                      843,568,192           20.87
        ...                   1,016,104,564           20.82
        A29                   1,364,178,406           16.62
 A line of text
 Blank
 Text
 Text
        A                          B                    C
        A1                   57,624,609,830           20.99
        A2                   49,837,119,260           20.90
        A3                      839,812,303           20.88
        A4                      843,568,192           20.87
        ...                   1,016,104,564           20.82
        A29                   1,364,178,406           16.62 

我希望得到所有带有它值的A1,然后是所有带有值的A2,依此类推。 我到目前为止所做的是

cat myFile.csv | awk '{if (NR > 5 && NR <= 29) printf $1"\t"}' > tmp1.csv

我在新文件tmp1.csv中的不同单元格中获得A1 A2 A3 .... 然后

cat myFile.csv | grep A1 | awk '{print $2}'

获取A1的值,将粘贴复制到tmp1文件中的A1列。 我试过了

#!/bin/bash
input="myFile.csv"
while IFS= read -r line

do

    awk '{if (NR > 4 && NR <= 28) | grep A1 | awk print $2 }'

done < "$input"

但不能使其产生与

相同的结果
      A1                 A2                 A3              A4        ... 
57,624,609,830     49,837,119,260      839,812,303      839,812,303   ...
57,624,609,830     49,837,119,260      839,812,303      839,812,303   ...
...

在一个文件中。换句话说,对于我来说,从第5行到第28行是理想的,不同单元格中的$ 1和每列中的$ 2相应。

更新

cat myFile.csv | awk '{if (NR > 5 && NR <= 29) printf $1"\t"}'

给了我关心的线条的内容。如何循环进入整个文件,在所有行中获取所有内容?例如,而不是

NR>5 && NR<=29要x = 1 NR>x+4 && NR<=x+28并最终获得内容。

1 个答案:

答案 0 :(得分:1)

awk救援!

$ awk '/A[0-9]+/' file | sed -r 's/^ +//g' | sort -k1.1,1.1 -k1.2n

A1                   57,624,609,830           20.99
A1                   57,624,609,830           20.99
A2                   49,837,119,260           20.90
A2                   49,837,119,260           20.90
A3                      839,812,303           20.88
A3                      839,812,303           20.88
A4                      843,568,192           20.87
A4                      843,568,192           20.87
A29                   1,364,178,406           16.62
A29                   1,364,178,406           16.62

或者如果您的sort支持版本排序,它也会起作用。您可以通过添加&& NF==3

来限制模式匹配

如果需要转置布局,可以将第一个脚本的输出通过管道传输到

$ ... | awk 'NR%2{h=h FS $1; r1=r1 FS $2} !(NR%2){r2=r2 FS $2}
              END{print h; print r1; print r2}' | column -t

A1              A2              A3           A4           A29
57,624,609,830  49,837,119,260  839,812,303  843,568,192  1,364,178,406
57,624,609,830  49,837,119,260  839,812,303  843,568,192  1,364,178,406

或将两者合并为一个脚本,特别是如果您的记录已经排序。

<强>更新

从原始输入文件开始的组合脚本

$ awk '/A[0-9]+/ && NF==3{if (!a[$1]++) {h=h FS $1; r1=r1 FS $2} else {r2=r2 FS $2}}
                      END{print h; print r1; print r2}' file | 
  column -t

A1              A2              A3           A4           A29
57,624,609,830  49,837,119,260  839,812,303  843,568,192  1,364,178,406
57,624,609,830  49,837,119,260  839,812,303  843,568,192  1,364,178,406