来自awk中多个输入的输出匹配列

时间:2019-08-09 04:26:51

标签: awk

假设我只需要这两个输入中的一些数据,它们分别是inputA.txt中的“ A”和inputB.txt中的“ B”

==> inputA.txt <==
A 10214027 6369158
A 10214028 6369263
A 10214029 6369321
A 10214030 6369713
A 10214031 6370146
A 10214032 6370553
A 10214033 6370917
A 10214034 6371322
A 10214035 6371735
A 10214036 6372136

所以我只想要带有A的数据

==> inputB.txt <==
B 50015214 5116941
B 50015215 5116767
B 50015216 5116577
B 50015217 5116409
B 50015218 5116221
B 50015219 5116044
B 50015220 5115845
B 50015221 5115676
B 50015222 5115512
B 50015223 5115326

这里也一样,只想要B的

并且我已经构建了脚本,但是由于使用了多个输入,因此脚本已经翻倍了。

#!/bin/awk -f
BEGIN{
    printf "Column 1\tColumn 2\tColumn 3"
}
/^A/{
    c=substr($2,1,4)
    d=substr($2,5,3)
    e=substr($3,1,4)
    f=substr($3,5,3)
}
{
    printf "%4.1f %4.1f %4.1f %4.1f\n",c,d,e,f > "outputA.txt"
} 
/^B/{
    c=substr($2,1,4)
    d=substr($2,5,3)
    e=substr($3,1,4)
    f=substr($3,5,3)
}
{
    printf "%4.1f %4.1f %4.1f %4.1f\n",c,d,e,f > "outputB.txt"
}

让我知道您对此的想法。

预期输出

==> outputA.txt <==
Column 1 Column 2 Column 3 Column 4
1021 4027 6369 158
1021 4028 6369 263
1021 4029 6369 321
1021 4030 6369 713
1021 4031 6370 146
1021 4032 6370 553
1021 4033 6370 917
1021 4034 6371 322
1021 4035 6371 735
1021 4036 6372 136
==> outputB.txt <==
Column 1 Column 2 Column 3 Column 4
5001 5214 5116 941
5001 5215 5116 767
5001 5216 5116 577
5001 5217 5116 409
5001 5218 5116 221
5001 5219 5116 044
5001 5220 5115 845
5001 5221 5115 676
5001 5222 5115 512
5001 5223 5115 326

3 个答案:

答案 0 :(得分:3)

使用GNU awk和FIELDWIDTHS:

awk 'BEGIN{FIELDWIDTHS="1 1 4 4 1 4 3"}
     {out="output" $1 ".txt"} 
     FNR==1{print "Column 1 Column 2 Column 3 Column 4" >out}
     {print $3,$4,$6,$7 >out}' inputA.txt inputB.txt

使用FIELDWIDTHS将当前行拆分为七个列。 out包含新文件的名称。如果到达当前文件的第一行,则将标题打印到新文件。对于每一行,将四列打印到新文件中。


请参阅:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:2)

请您尝试以下。

awk '
FNR==1{
  sub(/[a-z]+/,"",FILENAME)
  file="output"FILENAME".txt"
  print "Column 1 Column 2 Column 3 Column 4" > (file)
}
{
  print substr($0,3,4),substr($0,7,4),substr($0,12,4),substr($0,16,3) > (file)
}
'  inputA inputB

说明:

awk '                                                                                ##Starting awk program here.
FNR==1{                                                                              ##Checking condition if FNR==1, line number is 1 then do following.
  sub(/[a-z]+/,"",FILENAME)                                                          ##Substituting all small letters from file name with NULL.
  file="output"FILENAME".txt"                                                        ##Creating variable file whose value is string output FILENAME and .txt
  print "Column 1 Column 2 Column 3 Column 4" > (file)                               ##Printing headers to output file.
}
{
  print substr($0,3,4),substr($0,7,4),substr($0,12,4),substr($0,16,3) > (file)       ##Printing substrings values as per OP need to output files.
}
'  inputA inputB                                                                     ##Mentioning multiple Input_file names here.

答案 2 :(得分:2)

您在这里不需要substr。清空第一个字段,每四位数插入一个空格,强制awk重新解析字段,然后打印:

awk '$1=="A"{
  $1=""
  gsub(/[0-9]{4}/,"& ")
  $1=$1
  print
}' inputA.txt

其输出:

1021 4027 6369 158
1021 4028 6369 263
1021 4029 6369 321
1021 4030 6369 713
1021 4031 6370 146
1021 4032 6370 553
1021 4033 6370 917
1021 4034 6371 322
1021 4035 6371 735
1021 4036 6372 136

很明显,这仅适用于一个输入,但我相信参考其他答案,您可以对其进行调整以处理多个文件