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

我有一个用逗号分隔的文件,正在格式化以使用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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值