Changing second column in csv conditionally





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







4















im new to bash and would like some help.



I have a csv that looks like:



data/train/4/36280.png,four
data/train/2/10317.png,two
data/train/2/57890.png,two
data/train/1/53448.png,one
data/train/8/58233.png,eight
data/train/4/23599.png,four
data/train/2/35051.png,two
data/train/1/12323.png,one
data/train/9/18562.png,nine
data/train/8/46629.png,eight
data/train/7/1746.png,seven


where first column is path and second is class. I would like to change the second column conditionally. In pseudo code I want something like: If second column "four" change it to the next rows class.



So far I´ve tried just to see if I can change a class to another, but without success. awk '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv gives me the same csv.



Basically I would like a script that gives me following output csv:



data/train/4/36280.png,seven
data/train/2/10317.png,four
data/train/2/57890.png,two
data/train/1/53448.png,two
data/train/8/58233.png,one
data/train/4/23599.png,eight
data/train/2/35051.png,four
data/train/1/12323.png,two
data/train/9/18562.png,one
data/train/8/46629.png,nine
data/train/7/1746.png,eight









share|improve this question









New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

    – steeldriver
    20 hours ago











  • What is "the next rows class" ? Could you please edit your question and add an example output?

    – RoVo
    20 hours ago











  • You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

    – iKnowItAll
    20 hours ago


















4















im new to bash and would like some help.



I have a csv that looks like:



data/train/4/36280.png,four
data/train/2/10317.png,two
data/train/2/57890.png,two
data/train/1/53448.png,one
data/train/8/58233.png,eight
data/train/4/23599.png,four
data/train/2/35051.png,two
data/train/1/12323.png,one
data/train/9/18562.png,nine
data/train/8/46629.png,eight
data/train/7/1746.png,seven


where first column is path and second is class. I would like to change the second column conditionally. In pseudo code I want something like: If second column "four" change it to the next rows class.



So far I´ve tried just to see if I can change a class to another, but without success. awk '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv gives me the same csv.



Basically I would like a script that gives me following output csv:



data/train/4/36280.png,seven
data/train/2/10317.png,four
data/train/2/57890.png,two
data/train/1/53448.png,two
data/train/8/58233.png,one
data/train/4/23599.png,eight
data/train/2/35051.png,four
data/train/1/12323.png,two
data/train/9/18562.png,one
data/train/8/46629.png,nine
data/train/7/1746.png,eight









share|improve this question









New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





















  • The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

    – steeldriver
    20 hours ago











  • What is "the next rows class" ? Could you please edit your question and add an example output?

    – RoVo
    20 hours ago











  • You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

    – iKnowItAll
    20 hours ago














4












4








4








im new to bash and would like some help.



I have a csv that looks like:



data/train/4/36280.png,four
data/train/2/10317.png,two
data/train/2/57890.png,two
data/train/1/53448.png,one
data/train/8/58233.png,eight
data/train/4/23599.png,four
data/train/2/35051.png,two
data/train/1/12323.png,one
data/train/9/18562.png,nine
data/train/8/46629.png,eight
data/train/7/1746.png,seven


where first column is path and second is class. I would like to change the second column conditionally. In pseudo code I want something like: If second column "four" change it to the next rows class.



So far I´ve tried just to see if I can change a class to another, but without success. awk '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv gives me the same csv.



Basically I would like a script that gives me following output csv:



data/train/4/36280.png,seven
data/train/2/10317.png,four
data/train/2/57890.png,two
data/train/1/53448.png,two
data/train/8/58233.png,one
data/train/4/23599.png,eight
data/train/2/35051.png,four
data/train/1/12323.png,two
data/train/9/18562.png,one
data/train/8/46629.png,nine
data/train/7/1746.png,eight









share|improve this question









New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












im new to bash and would like some help.



I have a csv that looks like:



data/train/4/36280.png,four
data/train/2/10317.png,two
data/train/2/57890.png,two
data/train/1/53448.png,one
data/train/8/58233.png,eight
data/train/4/23599.png,four
data/train/2/35051.png,two
data/train/1/12323.png,one
data/train/9/18562.png,nine
data/train/8/46629.png,eight
data/train/7/1746.png,seven


where first column is path and second is class. I would like to change the second column conditionally. In pseudo code I want something like: If second column "four" change it to the next rows class.



So far I´ve tried just to see if I can change a class to another, but without success. awk '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv gives me the same csv.



Basically I would like a script that gives me following output csv:



data/train/4/36280.png,seven
data/train/2/10317.png,four
data/train/2/57890.png,two
data/train/1/53448.png,two
data/train/8/58233.png,one
data/train/4/23599.png,eight
data/train/2/35051.png,four
data/train/1/12323.png,two
data/train/9/18562.png,one
data/train/8/46629.png,nine
data/train/7/1746.png,eight






command-line bash awk csv






share|improve this question









New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited 19 hours ago









RoVo

8,1411943




8,1411943






New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 20 hours ago









iKnowItAlliKnowItAll

233




233




New contributor




iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






iKnowItAll is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.













  • The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

    – steeldriver
    20 hours ago











  • What is "the next rows class" ? Could you please edit your question and add an example output?

    – RoVo
    20 hours ago











  • You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

    – iKnowItAll
    20 hours ago



















  • The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

    – steeldriver
    20 hours ago











  • What is "the next rows class" ? Could you please edit your question and add an example output?

    – RoVo
    20 hours ago











  • You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

    – iKnowItAll
    20 hours ago

















The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

– steeldriver
20 hours ago





The default field separator in awk is whitespace; if you have comma separated data, you will need to set the separator accordingly - either with the -F command line option, or by setting FS="," in a BEGIN rule.

– steeldriver
20 hours ago













What is "the next rows class" ? Could you please edit your question and add an example output?

– RoVo
20 hours ago





What is "the next rows class" ? Could you please edit your question and add an example output?

– RoVo
20 hours ago













You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

– iKnowItAll
20 hours ago





You mean like `awk FS="," '{ if ($2 == "zero") $2="one"; print $0 }' train.csv > new_file.csv´ Next row class for line 1 is line 2, column 2. I basically want to shuffle the class in an easy way

– iKnowItAll
20 hours ago










1 Answer
1






active

oldest

votes


















5














bash solution:



readarray -t filename < <(cut -d ',' -f1 train.csv)
readarray -t class < <(cut -d ',' -f2 train.csv)

for (( i=0; i<${#filename[@]}; i++ )); do
printf '%s,%sn' "${filename[$i]}" "${class[$((i-1))]}";
done > new_file.csv




Equivalent awk solution:



awk -F, '
{
filename[NR]=$1
class[NR]=$2
}
END {
OFS=","
print filename[1],class[NR]
for (i=2;i<=NR;i++) {
print filename[i],class[i-1]
}
}
' train.csv > new_file.csv


Both solutions first read the lines into arrays filename and class. Only difference is that the bash array starts with 0, the awk array with 1.



Then, we loop over the arrays and print the desired output. In the awk solution, we need to treat the first line separately as, unlike in bash, array[-1] does not return the last element.



The awk solution is a bit faster.






share|improve this answer


























  • I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

    – iKnowItAll
    19 hours ago











  • exactly, added to the answer

    – RoVo
    19 hours ago











  • Thanks alot!! Works great!

    – iKnowItAll
    19 hours ago












Your Answer








StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "89"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});






iKnowItAll is a new contributor. Be nice, and check out our Code of Conduct.










draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1131364%2fchanging-second-column-in-csv-conditionally%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









5














bash solution:



readarray -t filename < <(cut -d ',' -f1 train.csv)
readarray -t class < <(cut -d ',' -f2 train.csv)

for (( i=0; i<${#filename[@]}; i++ )); do
printf '%s,%sn' "${filename[$i]}" "${class[$((i-1))]}";
done > new_file.csv




Equivalent awk solution:



awk -F, '
{
filename[NR]=$1
class[NR]=$2
}
END {
OFS=","
print filename[1],class[NR]
for (i=2;i<=NR;i++) {
print filename[i],class[i-1]
}
}
' train.csv > new_file.csv


Both solutions first read the lines into arrays filename and class. Only difference is that the bash array starts with 0, the awk array with 1.



Then, we loop over the arrays and print the desired output. In the awk solution, we need to treat the first line separately as, unlike in bash, array[-1] does not return the last element.



The awk solution is a bit faster.






share|improve this answer


























  • I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

    – iKnowItAll
    19 hours ago











  • exactly, added to the answer

    – RoVo
    19 hours ago











  • Thanks alot!! Works great!

    – iKnowItAll
    19 hours ago
















5














bash solution:



readarray -t filename < <(cut -d ',' -f1 train.csv)
readarray -t class < <(cut -d ',' -f2 train.csv)

for (( i=0; i<${#filename[@]}; i++ )); do
printf '%s,%sn' "${filename[$i]}" "${class[$((i-1))]}";
done > new_file.csv




Equivalent awk solution:



awk -F, '
{
filename[NR]=$1
class[NR]=$2
}
END {
OFS=","
print filename[1],class[NR]
for (i=2;i<=NR;i++) {
print filename[i],class[i-1]
}
}
' train.csv > new_file.csv


Both solutions first read the lines into arrays filename and class. Only difference is that the bash array starts with 0, the awk array with 1.



Then, we loop over the arrays and print the desired output. In the awk solution, we need to treat the first line separately as, unlike in bash, array[-1] does not return the last element.



The awk solution is a bit faster.






share|improve this answer


























  • I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

    – iKnowItAll
    19 hours ago











  • exactly, added to the answer

    – RoVo
    19 hours ago











  • Thanks alot!! Works great!

    – iKnowItAll
    19 hours ago














5












5








5







bash solution:



readarray -t filename < <(cut -d ',' -f1 train.csv)
readarray -t class < <(cut -d ',' -f2 train.csv)

for (( i=0; i<${#filename[@]}; i++ )); do
printf '%s,%sn' "${filename[$i]}" "${class[$((i-1))]}";
done > new_file.csv




Equivalent awk solution:



awk -F, '
{
filename[NR]=$1
class[NR]=$2
}
END {
OFS=","
print filename[1],class[NR]
for (i=2;i<=NR;i++) {
print filename[i],class[i-1]
}
}
' train.csv > new_file.csv


Both solutions first read the lines into arrays filename and class. Only difference is that the bash array starts with 0, the awk array with 1.



Then, we loop over the arrays and print the desired output. In the awk solution, we need to treat the first line separately as, unlike in bash, array[-1] does not return the last element.



The awk solution is a bit faster.






share|improve this answer















bash solution:



readarray -t filename < <(cut -d ',' -f1 train.csv)
readarray -t class < <(cut -d ',' -f2 train.csv)

for (( i=0; i<${#filename[@]}; i++ )); do
printf '%s,%sn' "${filename[$i]}" "${class[$((i-1))]}";
done > new_file.csv




Equivalent awk solution:



awk -F, '
{
filename[NR]=$1
class[NR]=$2
}
END {
OFS=","
print filename[1],class[NR]
for (i=2;i<=NR;i++) {
print filename[i],class[i-1]
}
}
' train.csv > new_file.csv


Both solutions first read the lines into arrays filename and class. Only difference is that the bash array starts with 0, the awk array with 1.



Then, we loop over the arrays and print the desired output. In the awk solution, we need to treat the first line separately as, unlike in bash, array[-1] does not return the last element.



The awk solution is a bit faster.







share|improve this answer














share|improve this answer



share|improve this answer








edited 19 hours ago

























answered 19 hours ago









RoVoRoVo

8,1411943




8,1411943













  • I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

    – iKnowItAll
    19 hours ago











  • exactly, added to the answer

    – RoVo
    19 hours ago











  • Thanks alot!! Works great!

    – iKnowItAll
    19 hours ago



















  • I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

    – iKnowItAll
    19 hours ago











  • exactly, added to the answer

    – RoVo
    19 hours ago











  • Thanks alot!! Works great!

    – iKnowItAll
    19 hours ago

















I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

– iKnowItAll
19 hours ago





I tried it and it looks great! Could I ask how I would save this to a new CSV? I guess its putting > new_file.csv at the end maybe?

– iKnowItAll
19 hours ago













exactly, added to the answer

– RoVo
19 hours ago





exactly, added to the answer

– RoVo
19 hours ago













Thanks alot!! Works great!

– iKnowItAll
19 hours ago





Thanks alot!! Works great!

– iKnowItAll
19 hours ago










iKnowItAll is a new contributor. Be nice, and check out our Code of Conduct.










draft saved

draft discarded


















iKnowItAll is a new contributor. Be nice, and check out our Code of Conduct.













iKnowItAll is a new contributor. Be nice, and check out our Code of Conduct.












iKnowItAll is a new contributor. Be nice, and check out our Code of Conduct.
















Thanks for contributing an answer to Ask Ubuntu!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1131364%2fchanging-second-column-in-csv-conditionally%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

What other Star Trek series did the main TNG cast show up in?

Berlina muro

Berlina aerponto