IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux下常见命令paste命令使用及源码实现 -> 正文阅读

[系统运维]Linux下常见命令paste命令使用及源码实现

在Linux中paste 命令常用于合并文件的列。可以将指定的每个文件的行组成的行输出到标准输出,以制表符作为分隔符分隔。

paste语法

paste [OPTION]… [FILES]…

paste - 合并文件各行

参数

  • -d 或–delimiters=<间隔字符> 指定不同于空格或tab键的域分隔符。
  • -s或–serial  串列进行而非平行处理。
	while ((optc = getopt(argc, argv, "d:sz")) != -1)
	{
		switch (optc)
		{
		case 'd':
		  delim_arg = (optarg[0] == '\0' ? "\\0" : optarg); /*间隔字符*/
		  break;

		case 's':
		  serial_merge = true; /*串行合并 */
		  break;
		default:
		  break;
		}
	}

举例

首先我们先编译我们paste命令源代码

g++ paste.cpp -o my_paste

在这里插入图片描述
可执行文件为my_paste,后续本篇文章paste命令行都用自己实现的my_paste代替。

我们先准备两个文件,然后使用自己实现的my_paste解析。
在这里插入图片描述
默认情况下,使用 paste 命令合并文件,各文件中的各行将以制表符(Tab)作为分隔符进行合并并输出。

使用-d选项

-d(分隔符):paste命令默认使用制表符分隔符来合并文件。 可以使用 -d 选项将分隔符更改为任何其他字符。 如果将多个字符指定为分隔符,则 paste 以循环方式为每个文件行分隔使用它。

static int collapse_escapes (char const *strptr)
{
	char *strout = strdup(strptr);
	bool backslash_at_end = false;

	delims = strout;

	while (*strptr)
	{
		if (*strptr != '\\')	/* 转义字符  */
			*strout++ = *strptr++;	/* 转移它。  */
		else
		{
			switch (*++strptr)
			{
				case '0':
					*strout++ = EMPTY_DELIM;
				break;

				case 'b':
					*strout++ = '\b';
				break;

				case 'f':
					*strout++ = '\f';
				break;

				case 'n':
					*strout++ = '\n';
				break;

				case 'r':
					*strout++ = '\r';
				break;

				case 't':
					*strout++ = '\t';
				break;

				case 'v':
					*strout++ = '\v';
				break;

				case '\\':
					*strout++ = '\\';
				break;

				case '\0':
					backslash_at_end = true; /*结尾反斜杠 */
				goto done;

				default:
					*strout++ = *strptr;
				break;
			}
			
			strptr++;
		}
	}

	done:

	delim_end = strout;
	return backslash_at_end ? 1 : 0;
}

这是代码处理-d选项,用指定的间隔字符取代跳格字符。

在这里插入图片描述

使用-s选项

-s(串行):我们可以使用 -s 选项按顺序合并文件。 它从单个文件中读取所有行,并将所有这些行合并为一行,每行由制表符分隔。 这些单行由换行符分隔。 下面是具体代码实现部分。

static bool paste_serial (size_t nfiles, char **fnamptr)
{
  bool ok = true;	/* 如果发生打开或读取错误,则为 false */
  int charnew, charold; /* 当前和以前的字符读取*/
  char const *delimptr;	/* 当前分隔符字符 */
  FILE *fileptr;	/* 打开以读取当前文件*/

	for (; nfiles; nfiles--, fnamptr++)
	{
		int saved_errno;

		if (strcmp (*fnamptr, "-") == 0)
		{
			have_read_stdin = true;
			fileptr = stdin;
		}
		else
		{
			fileptr = fopen (*fnamptr, "r");
			if (fileptr == NULL)
			{

				ok = false;
				continue;
			}
		}

		delimptr = delims;	/* 设置分隔符字符串*/

		charold = getc (fileptr);
		saved_errno = errno;
		if (charold != EOF)
		{
			/* 'charold' 已设置。 打它!
			继续阅读字符,将它们存放在 'charnew' 中;
			输出 'charold',转换为适当的分隔符
			如果需要,字符。 在EOF之后,输出'charold'
			如果是换行符; 否则,输出它然后换行*/

			while ((charnew = getc (fileptr)) != EOF)
			{
				/* 处理旧字符 */
				if (charold == line_delim)
				{
					if (*delimptr != EMPTY_DELIM)
						putchar (*delimptr);

					if (++delimptr == delim_end)
						delimptr = delims;
				}
				else
					putchar (charold);

				charold = charnew;
			}
			saved_errno = errno;

			/* 命中EOF。 处理最后一个字符*/
			putchar(charold);
		}

		if (charold != line_delim)
			putchar (line_delim);

		if (ferror (fileptr))
		{
			ok = false;
		}

		if (fclose (fileptr) == EOF)
		{
			ok = false;
		}
	}
	return ok;
}

若使用paste指令的参数"-s",则可以将一个文件中的多行数据合并为一行进行显示。例如:
在这里插入图片描述

-d 和 -s 的组合以下示例显示如何为文件的顺序合并指定分隔符:

在这里插入图片描述

今天就分享paste命令使用到这里了,paste命令很简单,同时很实用,希望对你有帮助!

欢迎关注微信公众号【程序猿编码】,欢迎添加本人微信号(17865354792)交流学习。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:58:38  更:2021-08-15 16:00:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 19:13:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计