Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations IamaSherpa on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Interprete idea into awk syntax 1

Status
Not open for further replies.

erche

Technical User
Aug 13, 2003
15
ID
Hello,
I have a simple question, hope that somebody would help.
As i just browse a little about AWK, i don't really understand how to interprete my idea into AWK syntax.

File1
A1;Input1;A3;A4;A5
20;90;77;88;99
33;80;81;67;54
32;76;55;13;93
..
..
..

File2
B1;Input2;B3;B4;B5
22;93;71;68;89
31;60;21;87;74
39;96;57;83;27
..
..
..

What I want to do is :

Check the first row, second column (name it as xstr)
- if xstr = Input1
column should be taken : 3rd & 4th column (A3,A4)
- if xstr = Input2
column should be taken : 1st & 5th column (B1,B5)

Put those positions in one file.. which will look like this

A3;A4;B1;B5
77;99;22;89
..
..

That's the idea...
so, please help me interprete this with awk...

thanks in advance
 
Try....

paste -d';' File1 File2|awk 'BEGIN{FS=OFS=";"}{print $3,$4,$6,$10}'

Tested....

A3;A4;B1;B5
77;88;22;89
81;67;31;74
55;13;39;27
 

Hi Ygor,
Thanks for your reply...
I hope you still can help me for further questions...
what if, all of them are in one file, and they are separate by a keyword..
for example :

abc1;20;90;77;88;99
abc2;22;93;71;68;89
abc2;31;60;21;87;74
abc1;32;76;55;13;93
abc2;39;96;57;83;27
...
...

How can we get the same result for that input ?

Thanks in advance....

 
Maybe try...

awk '
BEGIN {FS=OFS=";"}
/^abc1/ {x=$4; y=$5}
/^abc2/ {print x,y,$2,$6}
' file1
 

hi Ygor,
I've tried your suggestions.
It is worked.
But, for a file with more columns, awk will output this error message :
awk - argument too long..

so, it won't produce any output.

this is the sample one line :

3;a;7;abc2;20030727050209;0;0;;4;3;1234;3;1000;3;X 2;3;X 3;3;X 4;3;X 5;3;X 6;3;X 7;3;X 8;3;X 9;3;X 10;3;X 11;3;X 12;3;X 13;3;X 14;3;X 15;3;X 16;3;X 17;3;X 18;3;X 19;3;X 20;3;X 21;3;X 22;3;X 23;3;X 24;3;X 25;3;X 26;3;X 27;3;X 0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;;4;1;12158146;1;302;1;40254160;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;;4;1;557542;1;20;1;1202126;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;00;1;0;1;0;1;0;1;0;1;0;1;0;1;0;;4;1;12705051;1;354;1;41216426;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;;4;1;8765813;1;300;1;36195047;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;34;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;;1;67863111;1;5;

It is very long. (I delete some columns to avoid long message)..

I think, first we have to create a list of columns that will be taken for abc1 and abc2.
for example :
- abc1 : take 3rd and 4th column
- abc2 : take 1st and 5th column
and reading from that list, we will run the awk just to grep those columns..

but the problem is, i still don't understand how to apply those conditions (making if abc1.. else if abc2...) ...

Hope you would still help me...

Thanks
 
What version of awk are you using? When I try with the example, I get this error.....

awk: Line 3;a;7;abc2;2003 cannot have more than 199 fields.
The input line number is 1. The file is file1.
The source line number is 2.

So try using an array.....

awk 'BEGIN {
OFS=";"
} {
split($0, a, ";");
if (a[1] == "abc1") {
x=a[4];
y=a[5]
}
else if (a[1] == "abc2") {
print x,y,a[2],a[6]
}
}' file1

 


Hello Ygor,
I already tried them,
but still not working, this error still appear :

stat@advcom:/s/i/Stat/testbed> ./testaw3.sh
awk: record `3;a/210;7;abc1...' too long
record number 1

actually, i had a script, another person made the script, and i just know the functional of the script without knowing further about awk.
and somehow, the input data already changed, the position of abc1 is not like the old one, also for the abc2.
this what he did :

- create a list :
strList=$(nawk 'BEGIN { printf(&quot;1,2,3,4,5&quot;); for(i=9; i<=2231; i+=202)
{ printf(&quot;,%d,%d,%d,%d&quot;,i+2,i+4,i+198,i+200)
}
}')

* somehow the position changed,
abc1 not on the pos 2 and 4 anymore (now 2,6), also
abc2 not on the pos 198, 200 (now 0,2)
somehow with the old script, there'll be double value, because no filtering.
if i change the old script like this :
printf(&quot;,%d,%d,%d,%d&quot;,i+2,i+6,i,i+2)
-> double value ....

- do some grepping :
grep &quot;^[13];paysf\/210;&quot; $filepathIn | cut -d&quot;;&quot; - f$strList >> ${pathOut}/a_210_${dateFile}.txt

my idea is :
put the filtering on this line :
strList=$(nawk 'BEGIN { printf(&quot;1,2,3,4,5&quot;); for(i=9; i<=2231; i+=202)
{
if abc1 then select this column : 4,5
else if abc2 then select this column : 0,6
}
}')
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top