gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:43 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com