column manipulation using awk
Clash Royale CLAN TAG#URR8PPP
up vote
3
down vote
favorite
I have a file with more than 200 columns. As for example purpose, I am here using a file with less number of columns(9). Below is the input file(few lines)
chr10 181243 225933 1 1 1 10 0 36
chr10 181500 225933 1 1 1 106 0 35
chr10 226069 255828 1 1 1 57 0 37
chr10 243946 255828 1 1 1 4 0 27
chr10 255989 267134 1 1 1 87 0 32
chr10 255989 282777 1 1 1 61 0 34
chr10 267297 282777 1 1 1 61 0 37
chr10 282856 283524 1 1 1 92 0 35
chr10 282856 285377 1 1 1 1 0 15
chr10 283618 285377 1 1 1 72 0 33
I want to rearrange the file such that my last column(here 9th column) is the 4th column in the output file and then print everything else. So the output I am looking for is
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
chr10 226069 255828 37 1 1 1 57 0
chr10 243946 255828 27 1 1 1 4 0
chr10 255989 267134 32 1 1 1 87 0
chr10 255989 282777 34 1 1 1 61 0
chr10 267297 282777 37 1 1 1 61 0
chr10 282856 283524 35 1 1 1 92 0
chr10 282856 285377 15 1 1 1 1 0
chr10 283618 285377 33 1 1 1 72 0
On a file with less number of columns, I can use something like this to achieve the above output:
awk -v OFS="t" 'print $1,$2,$3,$9,$4,$5,$6,$7,$8'
If now I have a file with large number of columns, how can I place the last column of the file as the 4th column and rest I print as it is?
awk
add a comment |Â
up vote
3
down vote
favorite
I have a file with more than 200 columns. As for example purpose, I am here using a file with less number of columns(9). Below is the input file(few lines)
chr10 181243 225933 1 1 1 10 0 36
chr10 181500 225933 1 1 1 106 0 35
chr10 226069 255828 1 1 1 57 0 37
chr10 243946 255828 1 1 1 4 0 27
chr10 255989 267134 1 1 1 87 0 32
chr10 255989 282777 1 1 1 61 0 34
chr10 267297 282777 1 1 1 61 0 37
chr10 282856 283524 1 1 1 92 0 35
chr10 282856 285377 1 1 1 1 0 15
chr10 283618 285377 1 1 1 72 0 33
I want to rearrange the file such that my last column(here 9th column) is the 4th column in the output file and then print everything else. So the output I am looking for is
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
chr10 226069 255828 37 1 1 1 57 0
chr10 243946 255828 27 1 1 1 4 0
chr10 255989 267134 32 1 1 1 87 0
chr10 255989 282777 34 1 1 1 61 0
chr10 267297 282777 37 1 1 1 61 0
chr10 282856 283524 35 1 1 1 92 0
chr10 282856 285377 15 1 1 1 1 0
chr10 283618 285377 33 1 1 1 72 0
On a file with less number of columns, I can use something like this to achieve the above output:
awk -v OFS="t" 'print $1,$2,$3,$9,$4,$5,$6,$7,$8'
If now I have a file with large number of columns, how can I place the last column of the file as the 4th column and rest I print as it is?
awk
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago
add a comment |Â
up vote
3
down vote
favorite
up vote
3
down vote
favorite
I have a file with more than 200 columns. As for example purpose, I am here using a file with less number of columns(9). Below is the input file(few lines)
chr10 181243 225933 1 1 1 10 0 36
chr10 181500 225933 1 1 1 106 0 35
chr10 226069 255828 1 1 1 57 0 37
chr10 243946 255828 1 1 1 4 0 27
chr10 255989 267134 1 1 1 87 0 32
chr10 255989 282777 1 1 1 61 0 34
chr10 267297 282777 1 1 1 61 0 37
chr10 282856 283524 1 1 1 92 0 35
chr10 282856 285377 1 1 1 1 0 15
chr10 283618 285377 1 1 1 72 0 33
I want to rearrange the file such that my last column(here 9th column) is the 4th column in the output file and then print everything else. So the output I am looking for is
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
chr10 226069 255828 37 1 1 1 57 0
chr10 243946 255828 27 1 1 1 4 0
chr10 255989 267134 32 1 1 1 87 0
chr10 255989 282777 34 1 1 1 61 0
chr10 267297 282777 37 1 1 1 61 0
chr10 282856 283524 35 1 1 1 92 0
chr10 282856 285377 15 1 1 1 1 0
chr10 283618 285377 33 1 1 1 72 0
On a file with less number of columns, I can use something like this to achieve the above output:
awk -v OFS="t" 'print $1,$2,$3,$9,$4,$5,$6,$7,$8'
If now I have a file with large number of columns, how can I place the last column of the file as the 4th column and rest I print as it is?
awk
I have a file with more than 200 columns. As for example purpose, I am here using a file with less number of columns(9). Below is the input file(few lines)
chr10 181243 225933 1 1 1 10 0 36
chr10 181500 225933 1 1 1 106 0 35
chr10 226069 255828 1 1 1 57 0 37
chr10 243946 255828 1 1 1 4 0 27
chr10 255989 267134 1 1 1 87 0 32
chr10 255989 282777 1 1 1 61 0 34
chr10 267297 282777 1 1 1 61 0 37
chr10 282856 283524 1 1 1 92 0 35
chr10 282856 285377 1 1 1 1 0 15
chr10 283618 285377 1 1 1 72 0 33
I want to rearrange the file such that my last column(here 9th column) is the 4th column in the output file and then print everything else. So the output I am looking for is
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
chr10 226069 255828 37 1 1 1 57 0
chr10 243946 255828 27 1 1 1 4 0
chr10 255989 267134 32 1 1 1 87 0
chr10 255989 282777 34 1 1 1 61 0
chr10 267297 282777 37 1 1 1 61 0
chr10 282856 283524 35 1 1 1 92 0
chr10 282856 285377 15 1 1 1 1 0
chr10 283618 285377 33 1 1 1 72 0
On a file with less number of columns, I can use something like this to achieve the above output:
awk -v OFS="t" 'print $1,$2,$3,$9,$4,$5,$6,$7,$8'
If now I have a file with large number of columns, how can I place the last column of the file as the 4th column and rest I print as it is?
awk
awk
edited 1 hour ago
Jeff Schaller
32.3k849109
32.3k849109
asked 1 hour ago
user3138373
82541430
82541430
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago
add a comment |Â
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
2
down vote
accepted
To replace the fourth field with the last field:
awk -v OFS="t" ' $4 = $NF; $NF=""; print
To insert the last field before the fourth field, we have to get a little creative:
awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
This will preserve the final field, zip through all the fields and move each one backward to the fourth forward one, and then put the desired fourth field into place:
$ echo 1..10 | awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
1 2 3 10 4 5 6 7 8 9
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
add a comment |Â
up vote
2
down vote
Perl is very concise for this: split each line into words, pop off the last word and insert it at
index 3 (0-based)
$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
...
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
2
down vote
accepted
To replace the fourth field with the last field:
awk -v OFS="t" ' $4 = $NF; $NF=""; print
To insert the last field before the fourth field, we have to get a little creative:
awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
This will preserve the final field, zip through all the fields and move each one backward to the fourth forward one, and then put the desired fourth field into place:
$ echo 1..10 | awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
1 2 3 10 4 5 6 7 8 9
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
add a comment |Â
up vote
2
down vote
accepted
To replace the fourth field with the last field:
awk -v OFS="t" ' $4 = $NF; $NF=""; print
To insert the last field before the fourth field, we have to get a little creative:
awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
This will preserve the final field, zip through all the fields and move each one backward to the fourth forward one, and then put the desired fourth field into place:
$ echo 1..10 | awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
1 2 3 10 4 5 6 7 8 9
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
add a comment |Â
up vote
2
down vote
accepted
up vote
2
down vote
accepted
To replace the fourth field with the last field:
awk -v OFS="t" ' $4 = $NF; $NF=""; print
To insert the last field before the fourth field, we have to get a little creative:
awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
This will preserve the final field, zip through all the fields and move each one backward to the fourth forward one, and then put the desired fourth field into place:
$ echo 1..10 | awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
1 2 3 10 4 5 6 7 8 9
To replace the fourth field with the last field:
awk -v OFS="t" ' $4 = $NF; $NF=""; print
To insert the last field before the fourth field, we have to get a little creative:
awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
This will preserve the final field, zip through all the fields and move each one backward to the fourth forward one, and then put the desired fourth field into place:
$ echo 1..10 | awk -v OFS="t" 'temp=$NF; for( i=NF;i>4;i-- ) $i=$(i-1); $4=temp ; print'
1 2 3 10 4 5 6 7 8 9
edited 1 hour ago
answered 1 hour ago
DopeGhoti
40.9k55080
40.9k55080
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
add a comment |Â
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
The request was to use the last column, and it was pointed out in the question that the number of fields in the actual data is not nine.
â DopeGhoti
1 hour ago
1
1
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
No, this overwrites the value in column 4. Look at the example input/output and you'll see the intention is to leave column 4 in existence, but move it over to column 5.
â Wildcard
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
Alternative which inserts rather than overwrites is now provided.
â DopeGhoti
1 hour ago
add a comment |Â
up vote
2
down vote
Perl is very concise for this: split each line into words, pop off the last word and insert it at
index 3 (0-based)
$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
...
add a comment |Â
up vote
2
down vote
Perl is very concise for this: split each line into words, pop off the last word and insert it at
index 3 (0-based)
$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
...
add a comment |Â
up vote
2
down vote
up vote
2
down vote
Perl is very concise for this: split each line into words, pop off the last word and insert it at
index 3 (0-based)
$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
...
Perl is very concise for this: split each line into words, pop off the last word and insert it at
index 3 (0-based)
$ perl -lane 'splice @F, 3, 0, pop(@F); print "@F"' file | column -t
chr10 181243 225933 36 1 1 1 10 0
chr10 181500 225933 35 1 1 1 106 0
...
answered 36 mins ago
glenn jackman
47.3k265103
47.3k265103
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f468879%2fcolumn-manipulation-using-awk%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
@JeffSchaller, pretty clear from the input/output sample that column 9 should be moved and "shunted" in between columns 3 and 4, forcing the rest over one slot.
â Wildcard
1 hour ago
In the output file, column9 are all zeroes because column 8 in the input was all zeroes
â user3138373
1 hour ago
Apologies for the confusion; I saw "rearrange" and assumed "swap"
â Jeff Schaller
1 hour ago