wyciąć kolumnę 2 z pliku tekstowego

15

Mój plik tekstowy nie ma separatora określającego spacje, tylko spacje, jak wyciąć kolumnę 2 do pliku wyjściowego,

39    207  City and County of San Francisc   REJECTED          MAT = 0
78    412  Cases and materials on corporat   REJECTED          MAT = 0
82    431  The preparation of contracts an   REJECTED          MAT = 0

Potrzebuję więc mocy wyjściowej

207
412
432
Riley
źródło

Odpowiedzi:

13

Najłatwiej jest awktraktować wiele kolejnych spacji jako jedną, więc

awk '{print $2}' file

odciski

207
412
431

Ale oczywiście istnieje wiele, wiele innych narzędzi, które wykonają pracę, nawet nieprzeznaczone do takich zadań jak grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file
jimmij
źródło
6

Użyj potoków, aby wysłać dane (np. Cat columns.txt) do wycięcia.

cat columns.txt | cut -d" " -f5

W podanych przykładowych danych pojedynczy separator spacji umieszcza dane w polu 5. Aby wysłać dane wyjściowe do innego pliku, użyj przekierowania.

cat collumns.txt | cut -d" " -f5 > field2.txt

Za pomocą polecenia awk możesz zrobić coś takiego, jak poniżej, który automatycznie rozpoznaje poszukiwane pole, ponieważ są tam dane (?) Muszę dowiedzieć się więcej o awk.

awk -F' ' '{print $2}' columns.txt
aeiounix
źródło
3
Inkatacja cat ... |jest rzadko konieczna. Większość poleceń uniksowych, takich jak cutjeden lub więcej plików wejściowych jako argumenty, np cut -d" " -f5 columns.txt.
Denis Howe
1

jak powiedział @jimmij, awk '{print $2}' filejest najprostszą odpowiedzią.

Jeśli z jakiegoś powodu nie chcesz używać awki nalegasz na użycie cut, możesz użyć seddo przekonwertowania każdego wystąpienia dwóch lub więcej spacji w pojedynczą kartę ( cutdomyślny ogranicznik) przed potokowaniem do cięcia:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
cas
źródło
0

Nadal możesz używać pojedynczych spacji jako ograniczników, będziesz mieć po prostu więcej kolumn. Zwiększ wartość, którą podajesz, cut -d' ' -fz 2 do 5, a może 6. Zwiększaj liczbę, aż uzyskasz pożądane wyniki.

Ryder
źródło
0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Powyższe jest bardzo przydatne, gdy narzędzia Linuksa, takie jak awk do ekstrakcji danych, nie działają, jeśli zmieniasz się na użytkownika „root” w skrypcie powłoki, jak poniżej:

sudo -i <<EOF
ps aux | grep -E -i "[l]js"  |grep -v "javaagent" | awk '{print $2}' # So awk won't work here
ps aux | grep -E -i "[l]js"  | grep -v "javaagent" | grep -Po '^[^ ]+[ ]+\K[^ ]+'
EOF
Alok Tiwari
źródło
1
Jedynym powodem „ awknie działa” w twoim przykładzie jest to, że dokument tutaj nie jest cytowany, co oznacza, że $2zostałby rozwinięty przez powłokę do drugiego parametru pozycyjnego. Rozwiązanie nie jest chyba, aby przełączyć się na grepkomendzie, ale albo uciec $w $2tak \$2lub po prostu zacytować cały dokument za pomocą <<'EOF'w miejscu <<EOF. Zauważ też, że zadanie w twoim przykładzie jest po prostu wykonywane przez pgrep.
Kusalananda
Wielkie dzięki @Kusalananda. Działa jak urok.
Alok Tiwari,