在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)交流学习。