我有一个文件(excel文件),它有一些列(不固定,动态更改),我需要获取几个特定列的值。我可以使用一个awk命令获取列,然后使用这些列号将行打印到另一个awk命令中。我有什么方法可以组合成一个吗?
awk -F',' ' {for(i=1;i < 9;i++) {if($i ~ /CLIENT_ID/) {print i}}} {for(s=1;s < 2;s++) {if($s ~ /SEC_DESC/) {print s}}} ' <file.csv> | awk -F "," '!($5~/...[0-9]L/ && $21~/FUT /) {print $0}' <file.csv>
为列(client_id and
sec_desc`)提供输出5和9,这是它们的列号(这会随着不同的文件而变化)。
现在使用此列号,我得到所需的输出如下:
awk -F "," '!($5~/...[0-9]L/ && $21~/FUT /) {print $0}' <file.csv>
如何将这些组合成一个命令?将变量从第一个传递到第二个?
输入(具有各种动态列的csv文件,对以下两列感兴趣)
CLIENT_ID SEC_DESC
USZ256 FUT DEC 16 U.S.
USZ256L FUT DEC 16 U.S. BONDS
WNZ256 FUT DEC 16 CBX
WNZ256L FUT DEC 16 CBX BONDS
输出给我第2和第4行与第二个awk命令中的正则表达式模式匹配(列号为5和21)。这些列号按文件更改,因此首先必须使用第一个awl获取列号,然后将其作为第二个awk的输入。
答案 0 :(得分:0)
要解决您的问题,您可以测试何时处理第一行,并将逻辑放在那里以发现列号。然后,在处理数据行时,请使用第一步中的列号。
(NR
是一个awk内置变量,包含正在处理的记录号。NF
是列数。)
例如:
$ cat red.awk
NR == 1 {
for (i=1; i<=NF; ++i) {
if ($i == "CLIENT_ID") cl_col = i;
if ($i == "SEC_DESC") sec_col = i;
}
}
NR > 1 && $cl_col ~ /...[0-9]L/ && $sec_col ~ /FUT /
$ awk -F'\t' -f red.awk RED_FUT_TST.csv
USZ256L FUT DEC 16 U.S. BONDS
WNZ256L FUT DEC 16 CBX BONDS
答案 1 :(得分:0)
我想我明白了。
awk -F',' '
NR == 1 {
for (i=1; i<=NF; ++i) {
if ($i == "CLIENT_ID") cl_col = i
if ($i == "SEC_DESC") sec_col = i
}
}
NR > 1 && !($cl_col ~ /...[0-9]L/ && $sec_col ~ /FUT /) {print $0}
' RED_FUT_TST.csv