linux - Bash 脚本 : Read a file and process it

标签 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并最终得到内容。

最佳答案

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

或者如果您的排序 支持版本排序,它也可以工作。您可以通过添加 && 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

关于linux - Bash 脚本 : Read a file and process it,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36291149/

相关文章:

linux - 奇怪的 POSIX 信号量行为(卡在 Linux 上的 sem_wait 上)

linux - .sh 文件的 CI Jenkins 权限被拒绝

java - 我找不到我的 CLASSPATH 并且我确定如何设置它?

python - 使用 runuser 时重定向到文件的奇怪行为

regex - tcsh:如何更改多个文件的文件扩展名?

arrays - 如何在换行符分隔的列表中使用 bash 的选择?

linux - 如何使用 bacula 编写备份脚本?

c++ - 如何在 opencv 检测到圆后执行一些 shell 脚本

bash - 重定向 stderr 会更改管道命令的退出代码

macos - 用于创建以当前日期命名的文件的 OS X 终端命令