我有一个这种结构的文件:
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
并最终获得内容。
答案 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