2010-06-15 16 views
11

Mam następujący plik i muszę drukować wszystko oprócz $1 i $2 przez awk

Plik:

INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 
... 

pożądane wyjście:

12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
... 
+0

możliwy duplikat [Używanie awk do drukowania wszystkich kolumn od n-tego do ostatniego] (http: // stackoverflow.com/questions/2961635/using-awk-to-print-all-columns-from-the-nth-to-the last) – Andy

Odpowiedz

11
$ cat t 
INFORMATION DATA 12 33 55 33 66 43 
INFORMATION DATA 45 76 44 66 77 33 
INFORMATION DATA 77 83 56 77 88 22 

$ awk '{for (i = 3; i <= NF; i++) printf $i " "; print ""}' t 
12 33 55 33 66 43 
45 76 44 66 77 33 
77 83 56 77 88 22 
+2

Nawet jeśli dla bieżącego pytania jest prostsze niż awk (patrz poniżej), jeśli masz aby wykonać obliczenia na twoich danych, bardzo dobrze jest znać swoją pętlę! Jeden z moich kolegów musiał wykonać uzupełnienia na dwóch pierwszych kolumnach, a następnie wydrukować pozostałe w następujący sposób: prosty blok printf, a po nim twój blok załatwił sprawę. Dzięki za odpowiedź (którą wyrzuciłem :-)). –

18

Cóż, biorąc pod uwagę swoje Dane, cięcie powinno wystarczyć:

cut -d\ -f3- infile 
3

danbens odpowiedź pozostawia spacje na końcu łańcucha wynikowego. tak poprawny sposób to zrobić byłoby:

awk '{for (i=3; i<NF; i++) printf $i " "; print $NF}' filename 
+0

dbałość o szczegóły ... +1 za to :) –

+1

awk '{for (i = 3; i

0

Oto kolejny awk rozwiązanie, które jest bardziej elastyczne niż jednego cut i jest krótsza niż inne awk nich. Zakładając, że separatory są pojedynczymi odstępami (modyfikować regex jako konieczny, jeśli nie są one):

awk --posix '{sub(/([^ ]*){2}/, ""); print}' 
9

Mimo to dodaje dodatkową przestrzeń na początku każdej linii w porównaniu do oczekiwanego wyjścia Yael, oto jest krótsze i prostsze awk rozwiązanie oparte niż wcześniej sugerowanych nich:

awk '{$1=$2=""; print}' 

lub nawet:

awk '{$1=$2=""}1' 
+1

świetne rozwiązanie! – inselberg

+1

Jeśli chcesz uniknąć czołowych spacji, możesz zrobić "awk" {1 $ = 2 $ = ""; 0 $ = 0 $; 1 $ = 1 $} 1 "plik" – user000001

1

Jeżeli pierwsze dwa słowa nie zmieni, chyba najprościej byłoby:

awk -F 'INFORMATION DATA ' '{print $2}' t 
0

Jeśli Perl jest opcja:

perl -lane 'splice @F,0,2; print join " ",@F' file 

Te opcje wiersza polecenia są używane:
-n pętla wokół każdej linii pliku wejściowego, nie automatycznie wydrukować
-l usuwa znaki nowej linii przed przetworzeniem i dodaje je z powrotem w trybie autosplit - podzielone linie wejściowe na tablicę . Domyślne podziałem na odstępami
-e wykonać kod Perl

splice @F,0,2 gładko usuwa kolumny 0 i 1 z tablicy @F
join " ",@F łączy elementy tablicy @F używając przestrzeni Między każdym elemencie

Odmiana dla plików wejściowych csv:

perl -F, -lane 'splice @F,0,2; print join " ",@F' file 

używa separatora -F pola op z przecinkiem

Powiązane problemy