Remove everything in a line before comma

╄→尐↘猪︶ㄣ 提交于 2020-03-22 23:16:33

问题


I have multiple files with lines like:

foo, 123456
bar, 654321
baz, 098765

I would like to remove everything on each line before (and including) the comma. Output would be:

123456
654321
098765

I attempted use the following after seeing something similar on another question, but the user didn't leave an explanation, so I'm not sure how the wildcard would be handled:

find . -name "*.csv" -type f | xargs sed -i -e '/*,/d'

Thank you for any help you can offer.


回答1:


METHOD 1: If it's always the 2nd column you want, you can do this with awk -- this command is actually splitting the rows on the whitespace rather than the comma, so it gets your second column -- the numbers, but without the leading space:

awk '{print $2}' < whatever.csv

METHOD 2: Or to get everything after the comma (including the space):

sed -e 's/^.*,//g' < whatever.csv

METHOD 3: If you want to find all of the .csv files and get the output of all of them together, you can do:

sed -e 's/^.*,//g' `find . -name '*.csv' -print`

METHOD 4: Or the same way you were starting to -- with find and xargs:

find . -name '*.csv' -type f -print | xargs sed -e 's/^.*,//'

METHOD 5: Making all of the .csv files into .txt files, processed in the way described above, you can make a brief shell script. Like this:

Create a script "bla.sh":

#!/bin/sh
for infile in `find . -name '*.csv' -print` ; do
        outfile=`echo $infile | sed -e 's/.csv/.txt/'`
        echo "$infile --> $outfile"

        sed -e 's/^.*,//g' < $infile > $outfile
done

Make it executable by typing this:

chmod 755 bla.sh

Then run it:

./bla.sh

This will create a .txt output file with everything after the comma for each .csv input file.

ALTERNATE METHOD 5: Or if you need them to be named .csv, the script could be updated like this -- this just makes an output file named "file-new.csv" for each input file named "file.csv":

#!/bin/sh
for infile in `find . -name '*.csv' -print` ; do
    outfile=`echo $infile | sed -e 's/.csv/-new.csv/'`
    echo "$infile --> $outfile"

    sed -e 's/^.*,//g' < $infile > $outfile
done



回答2:


Something like this should work for a single file. Let's say the input is 'yourfile' and you want the output to go to 'outfile'.

sed 's/^.*,//' < yourfile > outfile

The syntax to do a search-and-replace is s/input_pattern/replacement/

The ^ anchors the input pattern to the beginning of the line.

A dot . matches any single character; .* matches a string of zero or more of any character.

The , matches the comma.

The replacement pattern is empty, so whatever matched the input_pattern will be removed.



来源:https://stackoverflow.com/questions/46479884/remove-everything-in-a-line-before-comma

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!