これが可能かどうかはわかりません。
次のような熱があるとしましょう。
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
幅の構成はFIELDWIDTHS
次のとおりです。
Team Colour Game Rainfall PlayerName
XYZ Blue Cricket Yes Kapil
# <- 10 -><- 9 -><- 10 -><- 11 -><- NN -> FIELDWIDTHS
# $1 $2 $3 $4 $5 Field numbers
たとえば、次を使用することを選択できます。部分文字列()。最初の行に重複しない一意の名前が含まれている場合(例:not)を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
}