我有一个用逗号分隔的文件,正在格式化以使用printf创建2列.我正在使用awk将内容分组到相似的组中,以便可以将它们打印到格式正确的列中.

格式化是可行的,但是数组的内容会换行,而不是换行.

输入文件示例:

1,test,test1,test1

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2

2,test,test1,test2`

使用的命令:

awk -F"," 'NR>1 {a[$3]=a[$3] ? a[$3]", "$4" ("$2")" : $4" ("$2")"}

END {for (i in a) {print i":"a[i]}}' test.dat |

sort |

awk -F":" 'BEGIN { printf "%-15s %-10s\n", "COLUMN1","COLUMN2"; printf "%-15s %-10s\n", "-----------","----------"}

{ printf "%-15s %-10s\n", $1,$2}'

我也知道并尝试使用列-t -s“,”和pr

结果类似于(模拟示例):

COLUMN1 COLUMN2

======== =======

1 test1

2 test2, test2, test2, test2, test2, test2,test2, test2, test2,test2, test2, test2, test2, test2

如何包装第二列(如果第一列过长,即使第一列也是如此)以使其适合其框架?

COLUMN1 COLUMN2

======== =======

1 test1

2 test2, test2, test2, test2, test2, test2,test2, test2,

test2,test2, test2, test2, test2, test2

解决方法:

假设您发布的样本输入和您说得到的输出,让我们假设这是原始脚本正在执行的操作:

$cat tst.awk

BEGIN { FS=","; OFS="\t" }

{ vals[$1] = ($1 in vals ? vals[$1] ", " : "") $4 }

END {

print "column1", "column2"

print "=======", "======="

for (key in vals) {

print key, vals[key]

}

}

$awk -f tst.awk file

column1 column2

======= =======

1 test1

2 test2, test2, test2, test2, test2, test2, test2, test2, test2, test2, test2, test2

这是您提出问题的一个很好的起点,现在您想包装每一列吗?如果是这样的话,那么我将利用现有的UNIX工具(例如fold或fmt)为您打包,这样您就不必编写自己的代码来处理空格与中间词等的拆分:

$cat tst.awk

BEGIN { FS=","; OFS="\t" }

{ vals[$1] = ($1 in vals ? vals[$1] ", " : "") $4 }

END {

print "column1", "column2"

print "=======", "======="

for (key in vals) {

numKeyLines = wrap(key,15,keyArr)

numValLines = wrap(vals[key],50,valArr)

numLines = (numKeyLines > numValLines ? numKeyLines : numValLines)

for (lineNr=1; lineNr<=numLines; lineNr++) {

print keyArr[lineNr], valArr[lineNr]

}

}

}

function wrap(inStr,wid,outArr, cmd,line,numLines) {

if ( length(inStr) > wid ) {

cmd = "printf \047%s\n\047 \"" inStr "\" | fold -s -w " wid+0

while ( (cmd | getline line) > 0 ) {

outArr[++numLines] = line

}

close(cmd)

}

else {

outArr[++numLines] = inStr

}

return numLines+0

}

.

$awk -f tst.awk file

column1 column2

======= =======

1 test1

2 test2, test2, test2, test2, test2, test2, test2,

test2, test2, test2, test2, test2

如果您有很多需要包装的字段,那么由于每次折叠都会生成一个子外壳,所以它不会很快,所以这里有一个全awk版本,它会在可能的情况下分开,测试边缘情况并按摩到适合:

$cat tst.awk

BEGIN { FS=","; OFS="\t" }

{ vals[$1] = ($1 in vals ? vals[$1] ", " : "") $4 }

END {

print "column1", "column2"

print "=======", "======="

for (key in vals) {

numKeyLines = wrap(key,15,keyArr)

numValLines = wrap(vals[key],50,valArr)

numLines = (numKeyLines > numValLines ? numKeyLines : numValLines)

for (lineNr=1; lineNr<=numLines; lineNr++) {

print keyArr[lineNr], valArr[lineNr]

}

}

}

function wrap(inStr,wid,outArr, lineEnd,numLines) {

while ( length(inStr) > wid ) {

lineEnd = ( match(substr(inStr,1,wid),/.*[[:space:]]/) ? RLENGTH - 1 : wid )

outArr[++numLines] = substr(inStr,1,lineEnd)

inStr = substr(inStr,lineEnd+1)

sub(/^[[:space:]]+/,"",inStr)

}

outArr[++numLines] = inStr

return numLines

}

$awk -f tst.awk file

column1 column2

======= =======

1 test1

2 test2, test2, test2, test2, test2, test2, test2,

test2, test2, test2, test2, test2

标签:bash,linux,awk

来源: https://codeday.me/bug/20191012/1899620.html

linux打if语句如何换行,如何在Linux中的列内换行相关推荐

  1. html怎么设置凹陷效果,如何在css中实现圆角内凹效果

    如何在css中实现圆角内凹效果 发布时间:2020-07-22 09:22:57 来源:亿速云 阅读:122 作者:Leah 这期内容当中小编将会给大家带来有关如何在css中实现圆角内凹效果,文章内容 ...

  2. keyshot场景素材导入_KeyShot渲染操作技巧,教你如何在KeyShot中链接场景内材质

    KeyShot渲染操作技巧,教你如何在KeyShot中链接场景内材质 在KeyShot渲染中,材质的添加和使用是一项非常重要的渲染操作,这些操作关系着模型渲染的逼真程度,在我们实际渲染项目中肯定会更加 ...

  3. Microsoft Excel 教程:如何在 Excel 中更改列宽或行高?

    欢迎观看 Microsoft Excel 教程,小编带大家学习 Microsoft Excel 的使用技巧,了解如何在 Excel 中更改列宽或行高. 可以手动调整列宽或行高,或者自动调整列和行的大小 ...

  4. Python如何在main中调用函数内的函数

    Python如何在main中调用函数内的函数 一般在Python中在函数中定义的函数是不能直接调用的,但是如果要用的话怎么办呢? 一般情况下: def a():#第一层函数def b():#第二层函数 ...

  5. linux上无法发送163邮件,如何在linux中发送邮件,使用163邮箱发信。

    linux中,可以使用mail命令往外发送邮件,在使用前,只需要指定如下简单配置即可,这里演示用  163.com    邮箱发送至 qq.com 编辑 /etc/mail.rc,写入下方的参数 se ...

  6. Linux怎么给命令创建别名,如何在Linux上创建别名和Shell函数 | MOS86

    使用别名和Bash Shell函数创建自己的Linux命令. 驯服重复性任务,截断冗长的进程,并使用您经常使用且难以记住的选项配置标准命令. 别名和Shell脚本是Linux和类似Unix的操作系统中 ...

  7. linux命令行运行c程序,如何在Linux中编写和运行C程序

    Linux正在成为开发人员的编程天堂,成为开源和免费操作系统. Turbo C编译器已经是一种编译程序的旧方法,所以让程序员转向Linux以获得新的编程环境. 在本文中,我们将解释如何编写,编译和运行 ...

  8. linux怎么修改sftp默认端口,如何在 Linux 系统中如何更改 SFTP 端口

    SFTP(SSH文件传输协议)是一种安全文件协议,用于通过加密连接在两个主机之间传输文件. 它还允许您对远程文件执行各种文件操作并恢复文件传输. SFTP可以替代旧版FTP协议. 它具有FTP的所有功 ...

  9. linux 连接两个异构网,如何在Linux(或异构)网络上共享计算机?

    在有关共享计算机的这两篇文章中的第 1 部分中,我描述了我的异构本地网络以及如何使用它来比较和测试不同操作系统和体系结构上的应用程序.有几种技术使一台工作站上的用户可以运行位于另一台工作站上的应用程序 ...

最新文章

  1. Java中的ThreadLocal详解
  2. minigui显示时遇到的一个问题(暂时记下来)
  3. 深入浅出理解神经网络召回模型的优势
  4. 千万不要错过...超级搞笑
  5. AutowireCapableBeanFactory接口
  6. Android开发如何使用JNA
  7. 下拉推广系统立择火星推荐_下拉词删除都择火星下拉
  8. wpf xaml突然不能自动补齐代码_Xaml+C#桌面客户端跨平台初体验
  9. Oracle常用命令大全
  10. Primefaces Spring和Hibernate集成示例教程
  11. python从入门到精通pdf百度云-跟老齐学Python:从入门到精通 完整版PDF[7MB]
  12. 【DL】一文读懂深度学习中的N种卷积
  13. swagger 基础入门
  14. Mysql环境变量配置WIN10(保姆级)
  15. Structure-Revealing Low-Light Image Enhancement Via Robust Retinex Model TIP 2018阅读记录
  16. MFC工具箱没有控件解决方法
  17. 2023年进入TK海外直播公会,应该怎么玩?怎么申请?
  18. 解决iPhone手机时间格式化“NAN“问题
  19. 2020 Q2 DeFi报告:流动性挖矿狂热未带来新用户,DeFi任重道远
  20. 晶体硅太阳能电池产线性能跟踪项目

热门文章

  1. HTMLTESTRunner自动化测试报告增加截图功能
  2. JAVA的sleep
  3. mysql更换主键遇到的一个问题
  4. AndroidStudio_开发工具的设置_界面设置_字体设置_使用习惯设置_按钮设置等一些设置的介绍---Android原生开发工作笔记71
  5. 大数据_MapperReduce_协处理器_类似Mysql的触发器---Hbase工作笔记0024
  6. STM32工作笔记0043---什么是漏源电压,栅源电压
  7. 架构部署001---双机集群(HA)系统
  8. C#.NET学习笔记1---C#.NET简介
  9. caffe 使用小技巧
  10. nnlm 中的 Softmax