Давайте представим, что это то, что делает ваш оригинальный скрипт, учитывая ваш опубликованный пример ввода и вывод, который, как вы говорите, вы получаете:
$ 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
Если у вас есть много полей, которые нужно обернуть, то это не будет быстрым из-за появления подоболочки для каждого вызова fold
Итак, вот версия 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