вырезать столбец 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
jimmij
источник
6

Используйте каналы для отправки ваших данных (например, cat columns.txt) в разрез.

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

В приведенных вами примерах данных один разделитель пробелов помещает нужные данные в поле 5. Для отправки этого вывода в другой файл используйте перенаправление.

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

Используя команду awk, вы можете сделать что-то похожее на приведенное ниже, которое автоматически распознает поле, которое вы ищете, потому что там есть данные (?) Мне нужно больше узнать о awk.

awk -F' ' '{print $2}' columns.txt
aeiounix
источник
3
Инкататация cat ... |необходима редко. Большинство команд Unix, например, cutпринимают один или несколько входных файлов в качестве аргументов, например cut -d" " -f5 columns.txt.
Денис Хоу
1

как сказал @jimmij, awk '{print $2}' fileэто самый простой ответ.

Если по какой-то причине вы не хотите использовать awkи настаиваете на использовании cut, вы можете использовать sedдля преобразования каждого экземпляра двух или более пробелов в одну вкладку ( cutразделитель по умолчанию) перед конвейерной обработкой в ​​cut:

$ sed -e 's/  \+/\t/g' riley.txt | cut -f2 
207
412
431
саз
источник
0

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

Ryder
источник
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. Оно работало завораживающе.
Алок Тивари