unix 每隔6个空格将一行转换为多行

6yjfywim  于 2023-06-22  发布在  Unix
关注(0)|答案(4)|浏览(192)

我有下面这样的文字

Current state of abc : RUNNING Current state of def : RUNNING Current state of ghi : RUNNING

我希望这一行被分割成多行如下

Current state of abc : RUNNING 
Current state of def : RUNNING 
Current state of ghi : RUNNING

我尝试使用tr命令,如tr ' ' '\n',但它在每个空格后打印行。

uoifb46i

uoifb46i1#

继续tr思想:

tr -s ' ' '\n' | paste -d ' ' - - - - - -
# or, handle tabs too
tr -s '[:space:]' '\n' | paste -d ' ' - - - - - -

或者sed,每6个单词后插入一行换行符

sed -E 's/([^[:space:]]+[[:space:]]+){6}/&\n/g'

在perl中也有同样的想法

perl -pe 's/(\S+\s+){6}/$&\n/g'

或GNU grep for -o\S/\s

grep -Eo '(\S+\s+){5}\S+'

或GNU awk for multi-char RS and RT and \S/\s

awk -v RS='(\\S+\\s+){5}\\S+' 'RT{print RT}'
eblbsuwk

eblbsuwk2#

awk -v RS=" " '{ printf("%s%s", $0, (NR % 6) ? " " : "\n") }'

将单个空格视为严格的记录分隔符。每一个字都是一个字,而不是一个字。我们打印了所有记录。如果不是每六个记录,我们就在它后面打印一个空格。如果是每六条记录,我们在它后面打印一行换行符。

niwlg2el

niwlg2el3#

使用任何版本的awk。使用awk中显示的示例,您可以尝试以下操作。这里使用正则表达式(^| )(\S+\s){5}\S+(\s|$)来解决这个问题。

awk '
{
  while(match($0,/(^| )(\S+\s){5}\S+(\s|$)/)){
    val=substr($0,RSTART,RLENGTH)
    sub(/ $/,"",val)
    print val
    $0=substr($0,RSTART+RLENGTH)
  }
}
' Input_file
jutyujz0

jutyujz04#

我将利用GNU AWK来完成这项任务,如下所示,让file.txt内容

Current state of abc : RUNNING Current state of def : RUNNING Current state of ghi : RUNNING

然后

awk '{for(i=1;i<=NF;i+=1){printf("%s%s",$i,i%6?OFS:ORS)}}' file.txt

给出输出

Current state of abc : RUNNING
Current state of def : RUNNING
Current state of ghi : RUNNING

免责声明:该解决方案假设每行中的场的数量总是可被6整除,如果不是这种情况,则不使用它。说明:我使用for循环遍历行中的字段,打印字段值($i),后跟输出字段分隔符(默认值:如果列数不能被6整除(即除以6的余数不为零)否则输出行分隔符(默认值:我使用printf而不是print,因为前者不会自动添加跟踪换行符。

  • (在GNU Awk 5.1.0中测试)*

相关问题