виріжте колонку 2 з текстового файлу


15

У моєму текстовому файлі немає роздільника, щоб вказати роздільник просто пробілами, як вирізати стовпець 2 для виведення файлу

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

Тому вихід мені потрібен

207
412
432

Відповіді:


13

Найпростіше, awkколи трактується кілька послідовних пробілів як єдине, так

awk '{print $2}' file

відбитки

207
412
431

Але очевидно, що існує багато-багато інших інструментів, які виконають цю роботу, навіть не призначені для такого завдання, як grep:

grep -Po '^[^ ]+[ ]+\K[^ ]+' file

6

Використовуйте труби, щоб надсилати свої дані (наприклад, кішки колони.txt) у вирізані.

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

У наданих вами прикладах даних один роздільник пробілу поміщає потрібні дані у поле 5. Для надсилання цього виводу в інший файл використовуйте перенаправлення.

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

Використовуючи команду awk, ви можете зробити щось на кшталт наведеного нижче, яке автоматично розпізнає поле, за яким ви знаходитесь, тому що там є дані (?), Мені потрібно дізнатися більше про awk.

awk -F' ' '{print $2}' columns.txt

3
Інкуація cat ... |рідко необхідна. Більшість команд Unix, наприклад, cutприймають один або декілька вхідних файлів як аргументів, наприклад cut -d" " -f5 columns.txt.
Деніс Хоу

1

як сказав @jimmij, awk '{print $2}' fileце найпростіша відповідь.

Якщо з якихось причин ви не хочете використовувати awkта наполягати на використанні cut, ви можете sedперетворити кожен екземпляр двох або більше пробілів в одну вкладку ( cutроздільник за замовчуванням) перед тим, як прошивати в розріз:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431

0

Ви все одно можете використовувати окремі пробіли як роздільник, у вас просто буде більше стовпців. Збільште значення, яке ви даєте, cut -d' ' -fвід 2 до 5, а може і 6. Збільште кількість, поки не отримаєте бажаних результатів.


0
grep -Po '^[^ ]+[ ]+\K[^ ]+' file

Вище один дуже корисний, коли утиліти Linux, такі як awk для вилучення даних, не працюють, якщо ви переходите на "root" користувача всередині сценарію оболонки, як нижче одного:

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

1
Єдиною причиною " awkне буде працювати" у вашому прикладі є те, що тут-документ не цитується, це означає $2, що оболонка буде розширена на другий позиційний параметр. Рішення, ймовірно , не перемикаючись на grepкоманду , але або рятуючись від $в $2якості \$2або просто процитувати весь документ, використовуючи <<'EOF'замість <<EOF. Також зауважте, що завдання у вашому прикладі виконується більш просто pgrep.
Kusalananda

Велике спасибі @Kusalananda Це спрацювало як шарм.
Алок Тіварі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.