Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение жучара »

Друзья! вообще непонятная какая-то команда. Я понимаю, что она чего-то там разделяет и выводит. Вот файл foo.txt

Shell

$ cat foo.txt
qqq ww eeeee r t f iii
q www e r tt ff iiii
qq wwwww ee r tttt ffff ii
$
Выведу как-нибудь его. Разделителем пусть будет пробел и напишу -f 3-. Это будет значить, что:

Shell

man cut

-f, --fields=LIST
select only these fields; also print any line that contains no delimiter character, unless
the -s option is specified

...
N- from N'th byte, character or field, to end of line
Ну то есть каждая строка будет выведена с третьего поля до конца. А, поскольку, поля это слова, будет выведено вот что:

Shell

r t f iii
r tt ff iiii
r tttt ffff ii
Выводится же белиберда какая-то:

Shell

$ cat foo.txt | cut -d ' ' -f 3-
ww eeeee r t f iii
www e r tt ff iiii
wwwww ee r tttt ffff ii
$
ЧЯДНТ? Я предполагаю, что на вывод влияет тот факт, что несколько пробелов идут подряд. Но как именно влияет, понять не могу. Спасибо, кто откликнется. Debian 12.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21179
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение Bizdelnick »

Разделителем считается строго один пробел. Если несколько пробелов идут подряд, значит, между ними есть поле, просто оно пустое. Поэтому Ваша команда выводит всё после второго пробела в строке.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Re: Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение жучара »

Bizdelnick писал:
22.12.2024 23:11
Разделителем считается строго один пробел. Если несколько пробелов идут подряд, значит, между ними есть поле, просто оно пустое. Поэтому Ваша команда выводит всё после второго пробела в строке.
понял. Как грустно. Мне на самом деле необходимо вывести имена ФАЙЛОВ тар-архива. Так-то конечно сперва фильтрутся грепом, как-то так:

Shell

$ tar tvf foo.tar | grep "^-" > foo.txt
$
Но потом-то что с получившейся трёхсоттысячестрочной красотой делать? Я вот так придумал. Код делает задуманное в теме- отбрасывает во входном файле все кроме имён и выводит их. Кропал на коленке, сильно не пинать.

Код: Выделить всё

/*main.cpp*/
#include <stdio.h>

int main ()
{
	int c = 2;
	
	while (c != EOF)
	{
		for (int i = 0; i < 5; i++)
		{
			while ((c = getchar()) != ' ');
			while ((c = getchar()) == ' ');
		}
		
		do
		{
			printf ("%c",c);
			c=getchar();
		}
		while (c != 10 && c != EOF);
		if (c == 10)
			printf ("%c",c);
		if (c != EOF)
			c=getchar();
	}
	
	return 0;
}
компилить gcc main.cpp. Запускать cat foo.txt | ./a.out
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21179
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение Bizdelnick »

Почему просто не опустить опцию v и не получить сразу желаемое?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Re: Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение жучара »

Bizdelnick писал:
23.12.2024 01:09
Почему просто не опустить опцию v и не получить сразу желаемое?
потому, что тогда выведутся и папки и ссылки, и ещё там что-то, а мне нужны имена только ФАЙЛОВ. Ну и да, мне ещё сортирнуть их нужно по размеру. Так что только tvf.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1060
ОС: астралинукс

Re: Как на самом деле вывести несколько конечных полей строки с помощью команды cut?

Сообщение жучара »

Чтобы тему закрыть:

Код: Выделить всё

#include <stdio.h>
#include <string>   

int main (int argc, char* argv [])
{
	if (argc == 1)
	{
		return 0;
	}
	
	int count = std::stoi (argv [1]);

	int c = 2;
	if (argc > 2)
	{
		FILE* fp = fopen (argv [2], "r");

		while (c != EOF)
		{
			for (int i = 0; i < count; i++)
			{
				while ((c = getc (fp)) != ' ');
				while ((c = getc (fp)) == ' ');
			}
			
			do
			{
				printf ("%c",c);
				c = getc (fp);
			}
			while (c != 10 && c != EOF);
			if (c == 10)
				printf ("%c",c);
			if (c != EOF)
				c = getc (fp);
		}
		fclose (fp);
	}
	else
	{	
		while (c != EOF)
		{
			for (int i = 0; i < count; i++)
			{
				while ((c = getchar()) != ' ');
				while ((c = getchar()) == ' ');
			}
			
			do
			{
				printf ("%c",c);
				c=getchar();
			}
			while (c != 10 && c != EOF);
			if (c == 10)
				printf ("%c",c);
			if (c != EOF)
				c=getchar();
		}
	}

	return 0;
}
Запускать так:

./a.out 5 foo.txt

Где 5- номер столбца, начиная с которого будет выводиться строка (нумерация с нуля), foo.txt - имя файла. Если в какой-нибудь из строк будет только 5 столбцов (как в нашем примере), поведение не определено. Защиты от дураков нет.

Ещё так можно запускать:

cat foo.txt | ./a.out 5

Как видно, номер столбца обязателен и задаётся параметром. Компилить g++ main.cpp
Я просто читаю маны.
Спасибо сказали: