2

Using this script:

awk '{print $0"\t"NR}' test | grep NA | awk '{print $21}'

I get the line numbers in my file, having "NA" in them

326
399
672
1512
1734
1737
2212

Using sed, can I delete these lines from my file in the same command through standard input, by piping after the last awk command? If not, is there any way to do it in a simple way?

2
  • 3
    it would be better if you have posted a testable input fragment of your test file and the final result Commented Feb 26, 2018 at 10:24
  • 1
    yeah, please clarify if grep -v 'NA' test doesn't solve your requirement...
    – Sundeep
    Commented Feb 26, 2018 at 10:44

2 Answers 2

5

The simpler way is to use only sed:

sed '/NA/d' test >test.new

If you want to do in-place editing with GNU sed (this will modify the file test):

sed -i '/NA/d' test

The sed expression /NA/d will apply the d command on all lines in the input that matches the regular expression NA. The d command deletes lines.


If the line numbers were all you had, then the following would have worked too:

some_command | sed 's/$/d/' | sed -f /dev/stdin test >output

where some_command generates the line numbers that you'd like to delete from the file test.

The first sed turns the stream of numbers into a sed script by adding a d to each line. A line reading 100d would be interpreted as "delete line 100". This is then fed to the second sed as the actual script (it's reading the script via /dev/stdin) and it is applied to the file test.

The equivalent thing in a shell that knows about process substitutions:

sed -f <( some_command | sed 's/$/d/' ) test >output

But this is sillyness if you just want to delete lines containing the string NA.

4

Would it be too boring to just write this as one awk command?

awk '!/NA/' test 

The default action is to print the whole line, so this is the same as !/NA/ { print $0 } and would print any line that doesn't contain NA.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .