一、问题描述
最近需要利用Shell将多行多列文本中某一列,通过指定的分隔符合并成一行。假设需要处理的文本如下:

我们主要处理的是,将用户名提取处理,合并成一行,并通过逗号进行分隔。最终的格式如下:

“li1”,”huan”,”wang”,”wu”,”78c”,”zh”,”liu”,”zhao”,”xu”,”yang”

二、解决方案
首先是提取每一行的第X列,我最先能够想到的是awk命令,如下

awk '{print $2}' user1.txt
1
2
效果如下:

接着,是不是可以把替换符替换为逗号呢?
使用tr命令

awk '{print $2}' user1.txt |tr "\n" ","
1
效果:

看着好像是很接近,我们将上面的 , 分隔改为”,”分隔,是不是就okey了呢?命令如下:

awk '{print $2}' user1.txt |tr "\n" "\",\""
1
只是很遗憾,执行效果如下:

为什么呢?

因为tr是单个字符处理工具,而不是字符串处理工具。

既然tr不可以替换字符串,那么咱们就用sed命令。因为sed命令不仅仅可以处理字符,还可以处理字符串。

先来个简单的,将换行替换成逗号,命令如下:

awk '{print $2}' user1.txt |sed 's/\n/,/g'
1
执行结果如下:

好吧,竟然不听话。为什么呢?

因为sed命令处理过程是:从文本流中读取一行文本后,先把换行符去掉,然后进行相应的命令,处理完后再添加上换行符。这就导致sed命令,无法对换行符进行直接替换。

既然这样行不通,怎么搞呢?

解决方案一:
既然sed不能修改换行符,那就是在使用sed之前,把换行符干掉。干掉换行符,可以使用tr和xargs命令。

#使用xargs命令干掉换行符
awk '{print $2}' user1.txt |xargs
#使用tr命令干掉换行符
awk '{print $2}' user1.txt |tr "\n" " "
1
2
3
4

使用sed命令将空格替换成”,”,命令如下:

awk '{print $2}' user1.txt |xargs |sed 's/ /","/g'
1

但是开头和结尾少了一个双引号,解决方案如下:

echo '"'`awk '{print $2}' user1.txt |xargs |sed 's/ /","/g'`'"'
1
2
解决方案二:
echo '"'`awk '{print $2}' user1.txt | sed ':label;N;s/\n/","/;b label'`'"'
1

更多内容,可以点击这里:http://www.findme.wang/blog/detail/id/310.html

利用shell中awk和xargs以及sed将多行多列文本中某一列合并成一行的更多相关文章

  1. mysql去重, 把url重复且区为空的中去掉、统计重复数据、、结果集去重合并成一行

    delete from 表名 where id not in (select d.id from (SELECT id FROM 表名 GROUP BY c1,c2,c3,c4)as d) #去重复, ...

  2. 如何利用shell或者awk二维数组实现9x9乘法表?

    第一种:利用shell for循环来实现. for i in `seq 1 9`do for j in `seq 1 9` do if [ $i -ge $j ] then echo -en &quo ...

  3. Linux中awk抽取包含某字段的整行日志

    命令示例:awk '{if($0~"listAuths") print}'   xxx.log 解释说明:抽取xxx.log整个日志文件中,包含“listAuths”的行,打印输出

  4. 把文件每隔三行合并成一行(awk之RS、ORS与FS、OFS)

    比如文本如下:123abc合并后的结果是:1 2 3a b c #.txt a b c awk之RS.ORS与FS.OFS 转自http://www.cnblogs.com/fhefh/archive ...

  5. 【转载】vim 中如何替换选中行或指定几行内的文本

    https://segmentfault.com/q/1010000002552573/a-1020000002552589 :'<,'>s/替换项/替换为/g 以下命令将文中所有的字符串 ...

  6. SQLServer 中多行数据合并成一行数据(一个字段)

    需求:有四行数据,如下: 1.苹果 2.橘子 3.桃子 4.波罗 合并成一个字段:苹果,橘子,桃子,波罗: 需求明确之后,先弄点测试数据,上代码: --创建一个临时表 Create table #te ...

  7. TSQL--按某字段列分组,在将各组中某列合并成一行

    鉴于群里很多同事在问这个问题,我简单写个Demo,希望对初学者有帮助! 无真相,无解说,不解释,直接上Code! --========================================= ...

  8. Python中将变量按行写入txt文本中

    案例一: 讲数组a 循环写入名称为2.txt的文档中 # -*-coding:utf8-*- import requests from lxml import etree a=[1,2,3,4,5,6 ...

  9. mysql中的多行查询结果合并成一个

    SELECT GROUP_CONCAT(md.data1) FROM DATA md,contacts cc WHERE md.conskey=cc.id AND md.mimetype_id= 5 ...

  10. 利用Oracle分析函数row_number和sys_connect_by_path实现多行数据合并为一行

    emo场景,以oracle自带库中的表emp为例: select ename,deptno from emp order by deptno; ENAME DEPTNO CLARK 10 KING 1 ...

随机推荐

  1. kotlin关键字与操作符

    硬关键字:始终解释为关键字,不能用作标识符 as - 用于类型转换 - 为导入指定一个别名 as? 用于安全类型转换 break 终止循环的执行 class 声明一个类 continue 继续最近层循 ...

  2. 【Azure Cloud Service】使用RESTAPI更新Cloud Service(Extended Support) 中所配置的证书

    问题描述 当根据Cloud Service (Extended Support) 文档更新证书 ( https://docs.azure.cn/zh-cn/cloud-services-extende ...

  3. java工具篇-IDEA

    java的开发离不开好的开发工具,这就需要了解集成开发工具idea 背景黑白风格 设置方法File–>settings–>Appearance & Behavior–>App ...

  4. 自建家庭 KTV,在家想嗨就嗨

    现在用户最多.曲库最多的 K 歌软件是全民K歌,基本上想唱的歌都有,而且基本上每首歌都有 MV 或视频,使用体验也还不错,但是收费太贵了,对于一个月唱不了几次的打工人来说,唱一首歌就是"天价 ...

  5. AI五子棋_08 五子棋落子规则对应的价值

    AI五子棋 第八步 恭喜你到达第八步! 利用前一步得到的棋型分析结果,考察每一个可能落子的位置,给每一个可能的位置打分,将棋子落在分数最高的位置上.根据经验,我们可以总结出下面的落子规则: 1. 致胜 ...

  6. Web渗透06_XSS

    XSS漏洞描述 XSS是非常厉害的漏洞,在OWASP TOP10中榜上有名. XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网 ...

  7. 数据分析(matplotlib pyplot)

    文章目录 1.导入pyplot 库 2.绘出直线图 3.绘出实心点 4.绘出折线图 5.绘制正余弦函数 Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API. P ...

  8. 重温c语言之,7天开整,就是随便的写写,第一天

    一:转义字符 \t是一个字符,在printf里面,只占一个位置: 其他什么的抽象字符,用一个'\'+抽象字符就可以出现: \ddd这个是8进制的,可以转成10进制的,之后参考ASCLL码表即可 二:枚 ...

  9. 部署个SSH蜜罐玩玩,又能增强安全性,又能当电子蛐蛐

    前言 最近有个旧服务器的 SSL 证书过期了,每次都申请 SSL 证书太麻烦了,我直接把 swag 方案部署上去. 然后发现这个服务器在安全方面有所疏忽,所以又加固了一下,SSH 部分我想起来之前用过 ...

  10. Abp源码分析之Abp本地化

    aspnetcore mvc 实现本地化 新建mvc项目 修改Program.cs using Microsoft.AspNetCore.Localization; using Microsoft.A ...