sed for query


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting sed for query
# 8  
Old 05-20-2010
maybe I'm missing something in the OP's requirement...

Both sed and grep are line-oriented utilities, so you'd need to orient the input into 'records' for it to be of any use. For example:
Code:
-> echo 1,2,3,4,5,6,10000,10987,16572 |tr ',' "\n"
1
2
3
4
5
6
10000
10987
16572

-> echo 1,2,3,4,5,6,10000,10987,16572 |tr ',' "\n" |egrep -v '10000|16572' # leaving 10987 in play for now... 
1
2
3
4
5
6
10987

# 9  
Old 05-20-2010
Quote:
Originally Posted by curleb
maybe I'm missing something in the OP's requirement...

Both sed and grep are line-oriented utilities, so you'd need to orient the input into 'records' for it to be of any use.
Each line in the data is a record of comma-delimited fields. I don't see the problem with that.

Quote:
Originally Posted by curleb
Code:
-> echo 1,2,3,4,5,6,10000,10987,16572 |tr ',' "\n" |egrep -v '10000|16572' # leaving 10987 in play for now...

You'd need to specify a full line match with -x or use ^...$ anchors to prevent partial matches from falsely eliminating keepers. It would also be a good idea to use -F, forcing fixed patterns, and -f, so that egrep reads the fixed strings from a file (that way, we can avoid a potentially lengthy command line): egrep -vxFf listfile

However, this approach irreversibly modifies the data, since after tr it's not possible to distinguish between newlines that were newlines and newlines that were commas, unless some restrictive assumptions can be made regarding the data (such as forbidding blank lines or null comma-delimited fields). This may not be a problem; I'm just mentioning it in case it is relevant to the original poster.

If an output format of one number per line is acceptable, the following might suffice:
Code:
tr , \\n < datafile | egrep -vxFf listfile

Regards,
Alister

---------- Post updated at 03:49 PM ---------- Previous update was at 03:42 PM ----------

If the data must be left intact, format unmodified except for the deleted numbers, the following script would do the job:
Code:
#!/bin/sh

list=$1
data=$2

{
    while read n; do
        printf 'g/%s/s/^%s,//\\\ns/,%s,/,/g\\\ns/,%s$//\n' $n $n $n $n
    done < "$list"
    printf 'wq\n'
} | ed -s "$data"

Important: I have not modified IFS in the read statement, nor set read to raw mode, nor quoted $n, nor bothered to escape the contents of $n before inserting it into the ed regular expressions because I am assuming that each line in the list file consists of nothing but numerical digits. In sed basic regular expression syntax, each line in the list file should match /^[0-9]\{1,\}$/. If the following doesn't yield the entire list file's contents, then don't use the above code:
Code:
sed -n '/^[0-9]\{1,\}$/p'

Test run (in what follows, the script above is rmnum.sh):
Code:
$ cat data
1,2,3,4,5,6,7,8,9,10
11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30
31,32,33,34,35,36,37,38,39,40
$ cat list  # odd numbers
1
3
5
7
9
11
13
15
17
19
21
23
25
27
29
31
33
35
37
39
$ ./rmnum.sh list data
$ cat data
2,4,6,8,10
12,14,16,18,20
22,24,26,28,30
32,34,36,38,40

If the list may contain floating point numbers, whose decimal point would be considered a wildcard, I would opt to use perl. I don't use it often, but, as I recall, it supports quoting variable text within regular expressions, so that metacharacters are treated literally.

Regards,
Alister

Last edited by alister; 05-20-2010 at 05:03 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

SED Query

Hi all, I am trying to use SED to input lines to a file in a specific place. So far I have; sed '/#NewEntry/ i\Insert this line' myfile.txt The output is printing to screen correctly but what is the best way to write it back to the file without overwriting everything? I tried adding >... (6 Replies)
Discussion started by: JayC89
6 Replies

2. OS X (Apple)

Sed query

Hello Im fairly familiar with using the sed command for substitution, however I have been passed a script which checks the logged on username and directory type with a sed section which I cant figure out. The sed function has me baffled and I cant find out from the man page what its trying to do... (1 Reply)
Discussion started by: costaanglais
1 Replies

3. Shell Programming and Scripting

sed query

I have a sed query. There is a line which has tilde and I want to separate this line using sed. The line is: ABP_ETC_ROOT=~xdmadm The query to get this line is: sed -n '/\(.*\)~\(.*\)/p' infile I want to get xdmadm from this line and I am using this sed command: sed -n... (5 Replies)
Discussion started by: som.nitk
5 Replies

4. Shell Programming and Scripting

sed query

hi i had posted this earlier.. got no reply !! how to change assigned value in a file using sed suppose the file contains age = 30; how to change it to age =50; i tried sed 's/^age*./age =50;' filename but i am getting the o/p as age =50; 30; plz hlp!! (4 Replies)
Discussion started by: gopsman
4 Replies

5. Shell Programming and Scripting

query on sed

I have done a script using sed which replaces a string in file. I face 2 problems, while using sed command. 1)last line of the file is missing. 2)if i am are using wild card character in the command, Its not taking the next matching pattern ie if I am giving the pattern abc*def to be replaced... (2 Replies)
Discussion started by: iceiceice
2 Replies

6. UNIX for Dummies Questions & Answers

Reg: Query in sed

Hi Penchal, I would appreciate if you can provide me a brief explanation on what you are trying to do in the commnad below. echo "6-9-2008" | sed 's/\(.\)-\(.\)-\(.*\)/\3-0\2-0\1/g' Thanks Amit (1 Reply)
Discussion started by: patelamit009
1 Replies

7. Shell Programming and Scripting

sed related query

Hi I have a file which looks like this //string = "abcd"; //info //string = "*pqrs"; //add string = "#123"; //sub //string = "#1234567890" data = check(string) //string = "#1234567890" I want to modify this as string = "#987"; //mult data = check(string) How do i do that? (1 Reply)
Discussion started by: gopsman
1 Replies

8. Shell Programming and Scripting

SED query

I'm writing a script which word counts the number of lines in two files. If one file is bigger than the other I'd like to edit one of the files to delete some lines to make both the same. It does not matter where in the file the lines are deleted from. It's expected that this will be ran from... (3 Replies)
Discussion started by: chog1010
3 Replies

9. Shell Programming and Scripting

sed query

I have a series of folders /temp/a /temp/b /temp/c In folders a, b, and c, I have files a1.txt..........a20.txt b1.txt..........b40.txt & c1.txt..........c60.txt Each file has the same data format :- Line 1 AAAAA aaaa Line 2 BBB bbbbbb Line 3 CCCC cccccc Etc etc I need to write a... (13 Replies)
Discussion started by: grinder182533
13 Replies

10. Shell Programming and Scripting

sed query..

hi, I have an xml file and I need to replace the tags with different names all at a time here is what I have <cevalue> <cevalue1> <cevalue2> <cevalue3> <cevalue4> <cevalue5> and I need these like these... <cevalue> <cevalue> <cevalue> <cevalue> <cevalue> <cevalue> I tried a few but... (2 Replies)
Discussion started by: mgirinath
2 Replies
Login or Register to Ask a Question