이것이 가능한지 잘 모르겠습니다.
다음과 같은 열이 있다고 가정해 보겠습니다.
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
}