【发布时间】:2016-07-17 09:54:28
【问题描述】:
我有一个具有这种结构的文件:
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 并最终获得内容。
【问题讨论】:
-
您尝试使用
cat ... | grep ... | awk ...执行的所有操作都可以仅使用 awk 完成。awk是一种成熟的编程语言;考虑这样使用它——cat的目的是连接文件;如果您使用它仅从一个文件中读取,foo <filename[它只是运行命令foo并在filename上具有直接、可搜索的句柄] 比cat filename | foo[运行一个副本/usr/bin/cat和foo的副本,它们之间有一个基于mkpipe的 FIFO]。 -
...坦率地说,单独运行 awk -- 没有 bash,没有 grep -- 可能是正确的选择。
-
你为什么不做类似
awk '$1~/^A[0-9]+/ {# here is a line of AXX data...}'
标签: linux bash shell awk terminal