19

I have a tab-delimited file like:

name1   verb1   name2   verb2   etc...

I want to delete the second column. I tried editing one of these answers, but being not familiar with sed and awk, I couldn't.

Can anyone help me?

4
  • @KasiyA the OP's original used \t to indicate tabs. Oct 2, 2014 at 5:23
  • @steeldriver Ok you are right. I thought it's part of line. removed. But I edited to correct one according to first post.thanks Oct 2, 2014 at 5:26
  • 1
    vim visual-block mode doesn't solve the problem? (ctrl-v in normal mode, select the column, x to delete)?
    – Rmano
    Oct 2, 2014 at 9:35
  • @Rmano it helps thanks, but could you tell me how to go to the end of the file in visual mode? (I tried ctrl G, but it doesn't work).
    – teaLeef
    Oct 2, 2014 at 13:26

5 Answers 5

31

The accepted answer is much more elegant than this (I upvoted it!) but if you do not remember it you can use vim visual block mode directly. Open vim and go (normal mode) to the first corner of the column, like this:

enter image description here

Type CTRL-V and you can move the cursor to select the column, this is midway:

enter image description here

To go at the end, press G:

enter image description here

the block seems broken because we are on the last line which is blank; simply go up one line (with the up arrow or k) to see it again...:

enter image description here

Now you simply press x to delete the block:

enter image description here

1
  • Ugh, this didn't work for me. For some reason the column selection seemed to work, but then it deleted to the end of the line. I used another technique which I will post.
    – Mike S
    Feb 28, 2023 at 18:53
12

In vim, you should be able to use the command

:%s/\t[^\t]*//

(substitute TAB followed by zero or more occurrences of any character except TAB with nothing). If your file has only two columns you could use a slightly simpler :%s/\t.* or :%s/\t.*$which replace the first TAB and any following characters up to the end of the line.

0
6

I would use cut for this

cut -f1,3- file.txt > newfile.txt
mv newfile.txt file.txt

You can use this as a filter within vim, too (this will replace all the lines in the file; you could also use (for example) 2,9 instead of % to process lines 2-9, or select the lines you want with V):

:%!cut -f1,3-

-f1,3- means 'print field one, followed by field three and all fields until the end of the row'. By default, cut uses a tab as its delimiter; if you need something else, use the -d option (see man cut).

5

You can try either:

:%norm WdW

or manually using visual mode:

  1. Jump into second column (e.g. by pressing: W).
  2. Start visual-block by Ctrl+v.
  3. Select second column (e.g. by pressing: W, G).
  4. Delete it by pressing d.

To do it in-place from the command line, try:

$ ex +':exe ":%norm f\<Tab>dE"' -scx file

Related: How to write literal for Tab key to use for motion?

See also:

1
  • Yes, +1, but beware that if you have blank lines at the end step 3) can go awry...
    – Rmano
    Sep 18, 2019 at 11:13
0

To delete a column starting 83 characters from the left, up to the 94th character, you can try this (move your cursor around until you get to the sides of the columns you want to delete, and use Control-G to see what your cursor's position is):

:%s/\(^.\{83}\).\{11}/\1/

In short: Match the first 83 characters in each line, remember what was matched, now match the next 11 characters, and replace that entire bunch of 94 characters with those first matched 83 characters.

From http://www.peterscheie.com/unix/vi_del_columns.html .

More verbosely, here's the entire process: Hit the Escape key, followed by the colon, to get to the colon prompt. Now we say, "On every line %, we'll do a search-and-replace s and here's the regular expression we're going to look for /. Remember this next part \(: Starting at the beginning of the line ^, match any character ., do that 83 times \{83}, that's the end of the remembering \). Now match any character ., do that 11 times \{11}. Now I've told you what to look for, next we'll do what to replace it with /. Take the first thing I asked you to remember and use that to replace the stuff we matched \1. Finally, that's the end of our search-and-replace /.

But beware, in his article he talks about "colrm" as if that's part of vim, but it's not. It's a shell escape, and colrm is not on my Windows machine :-) .

1

You must log in to answer this question.

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