我不确定这是否可能。
假设我有这样的专栏:
Team Colour Game Rainfall PlayerName
XYZ Blue Cricket Yes Kapil
假设我需要搜索下面的任何数据,Game
我可以使用 awk 来完成,例如:
awk '{for(i=1;i<NF;i++)
{
if($i == "Game")
{
GameData=i
next
}
if( i == GameData )
{
print "Column below Game is" $i
}
}
}'
但如果我不确定某些列中的值可能会像其中任何一列一样丢失怎么办
XYZ Blue
可能会丢失,或者两者都可能丢失或存在。
编辑:假设T
团队的第一个字母(第一列)始终位于开头,C
颜色的第一个字母始终位于从开始的 10 个字符之后,G
游戏的第一个字母始终位于从开始的 20 个字符之后,依此类推。
答案1
我不知道是否真的有一个很好的方法来恢复这些信息,如果中间的字段是空白的,并且您允许分隔符包含未指定数量的字符,那么您如何知道您最终看到的字段是是Colour
还是不是PlayerName
?
在某些时候,数据需要以某种方式格式化能以编程方式进行解析,其他任何东西都只是糟糕的数据馈送的结果。如果您希望能够省略随机字段,则需要切换到单字符分隔符。
如果这是可读性问题,您当然可以编写数据演示文稿,其中字段是用空格填充,直到它们位于正确的列下方,但这样做会破坏让您知道实际正在查看哪个字段的信息,因此这是一个单向过程。
答案2
awk -v field="Game" -v FIELDWIDTHS="10 12 10 13 25" '
NR == 1 {cmpstr="^" field " *$";
for (i=0;i<6;i++) if ($i ~ cmpstr) { fieldindex=i; next;}; exit 1};
{gsub(" ","",$fieldindex); if ($fieldindex != "") print $fieldindex;}' inputfile
编辑1:如果未找到匹配的列,则退出并显示错误代码。
编辑2:不要输出空行。
答案3
您可以使用FIELDWIDTHS
,尽管这是一个gawk
扩展并且不那么便携。您还可以命名字段,例如:
awk '
BEGIN {
FIELDWIDTHS = "10 9 13 11 32"
team=1; colour=2; game=3; rainfall=4; name=5;
}
NR == 1 {
next
}
/./ {
print $3, $name
} ' fixwdata
宽度 in 的FIELDWIDTHS
组成如下:
Team Colour Game Rainfall PlayerName
XYZ Blue Cricket Yes Kapil
# <- 10 -><- 9 -><- 10 -><- 11 -><- NN -> FIELDWIDTHS
# $1 $2 $3 $4 $5 Field numbers
您可以选择使用例如子字符串()。如果第一行包含没有重复的唯一名称,即不是Name
, TeamName
,您可以使用index()
.
这看起来有点脆弱。如果数据是固定宽度的,您可以对其进行硬编码,但有些程序也会输出固定宽度 –但还根据数据宽度对齐数据。所以你可以得到:
输出1:
FLD1 FLD2
foo bar
输出2:
FLD1 FLD2
foobaz bar
此示例假设其他名称中没有重复名称:
awk '
function get_fld(fld_name)
{
return substr($0, col[fld_name"s"], col[fld_name"w"]);
}
BEGIN {
team=1
colour=2
game=3
rainfall=4
name=5
}
NR == 1 {
col["1s"]=0
col["2s"]=index($0, $2)
col["3s"]=index($0, $3)
col["4s"]=index($0, $4)
col["5s"]=index($0, $5)
col["1w"]=col["2s"] - 1
col["2w"]=col["3s"] - col["2s"]
col["3w"]=col["4s"] - col["3s"]
col["4w"]=col["5s"] - col["4s"]
col["5w"]=22
next
}
/./ {
printf(\
"%-5s {\n"\
"%12s: %s\n"\
"%12s: %s\n"\
"%12s: %s\n"\
"%12s: %s\n"\
"}\n",
get_fld(name),
"Team", get_fld(team),
"Colour", get_fld(colour),
"Game", get_fld(game),
"Rainfall", get_fld(rainfall));
} ' fixwdata
输入:
Team Colour Game Rainfall PlayerName
ABC Blue Cricket Yes Kapil
DEF Red Cricket Konos
DEF Yellow Go Kripl
DUX Black
Zon Purple Golf No Gim
Zon Purple Golf No Jom
输出:
Kapil {
Team: ABC
Colour: Blue
Game: Cricket
Rainfall: Yes
}
Konos {
Team: DEF
Colour: Red
Game: Cricket
Rainfall:
}
Kripl {
Team: DEF
Colour: Yellow
Game: Go
Rainfall:
}
{
Team: DUX
Colour: Black
Game:
Rainfall:
}
Gim {
Team: Zon
Colour: Purple
Game: Golf
Rainfall: No
}
Jom {
Team: Zon
Colour: Purple
Game: Golf
Rainfall: No
}