Как разбить файл на основе информации в столбце в Linux

Я хотел бы разделить эти строки, где значение во втором столбце меньше определенного значения.

пример ввода:

id1 19501112 id2 19831207 id3 20001212 id6 20000101 id10 20061213 id11 20081212 id12 20100109 id13 20101218 id14 20101212 id15 20111111 id16 20150919 id20 20141415 

и я хочу извлечь те строки, значение второго поля которых меньше 20100101. Таким образом, мой вывод будет следующим:

 id1 19501112 id2 19831207 id3 20001212 id6 20000101 id10 20061213 id11 20081212 

любое предложение, пожалуйста?

5 Solutions collect form web for “Как разбить файл на основе информации в столбце в Linux”

 $ awk '$2<20100101' file id1 19501112 id2 19831207 1d3 20001212 id6 20000101 id10 20061213 id11 20081212 

Типичная программа awk состоит из команд, которые выглядят так:

 condition { action } 

В нашем случае условие состоит в том, что второй столбец будет меньше 20100101. Это условие достаточно разумно написано как $2<20100101 . Поскольку мы не выполняем никаких действий , awk выполняет действие по умолчанию, которое предназначено для печати строки.

Подход Perl:

 perl -ane 'print if $F[1]<20100101' file 

-n читает входной файл по строкам и применяет скрипт, заданный с -e . -a делает perl вести себя как awk , он автоматически разбивает каждую строку ввода на пробелы и сохраняет каждое поле как элемент массива @F . Таким образом, сам сценарий будет печатать строку, если второе поле ( F[1] , массивы начинаются с 0) меньше 20100101.

версия оболочки:

 (while read l; do [ `echo $l | cut -d ' ' -f 2` -lt 20100101 ] && echo $l; done) < file 

Java-версия (требуется java-компилятор, лично я использую openJDK)

Создайте файл *.java со следующим содержимым:

 import java.io.File; import java.util.Scanner; import java.io.IOException; public class secondColumn { public static void main (String[] args) throws IOException { File inpFile = new File (args[0]); Scanner scan = new Scanner(inpFile); String id = ""; int num = 0; while (scan.hasNext()) { id = scan.next(); num = scan.nextInt(); if ( num < 20100101 ) System.out.println(id + " " + num); } } } 

Скомпилируйте и запустите так:

 xieerqi:$ javac secondColumn.java xieerqi:$ java secondColumn inputFile.txt id1 19501112 id2 19831207 1d3 20001212 id6 20000101 id10 20061213 id11 20081212 

Для вашего случая 2 это можно сделать в Bash, например, сохранить файл ниже как split :

 #!/usr/bin/env bash # Usage: ./split 'data.txt' 'value' paired=( ) value="$2" while read -a paired do [[ ${paired[1]} < $value ]] && echo "${paired[@]}" >> lessthan.txt || echo "${paired[@]}" >> morethan.txt done < "$1" # end file 

Обратите внимание, что переменная парная – это массив. Использование read -a paired считывает каждую строку в массив пар, основанный на нуле, поэтому элемент 1 представляет собой число процентов в каждой строке. Аргумент 2 для разделения – это значение, которое нужно использовать для разделения.

Для вашего случая 1 я не уверен, что вы хотите сделать, но вы можете изменить выше, чтобы, когда вы читали каждую строку файла, вы можете отправить столбец 1 ${paired[0]} или столбец 2 ${paired[1]} в любой файл, который вы хотите, в зависимости от значения столбца 2.

  • Как использовать регулярное выражение с AWK для замены строки?
  • Замените все вхождения символа в переменной с помощью скрипта korn
  • Скопируйте первые 2 строки из файла, а затем удалите строки
  • захватить текст из файла vtt
  • Почему «while .. read .. << EOL» выполняет расширение переменной, но <файл и | не?
  • Как использовать команду sed для изменения записи файла в строке в сценарии оболочки?
  • Извлечение строк между специальными символами
  • Как проверить, имеет ли файл уже строку с содержимым?
  • Вставить текст в определенные строки файла?
  • В верхнем регистре только первая буква каждой строки
  • Как я могу упростить эту команду только для использования awk?
  • Linux и Unix - лучшая ОС в мире.