在 unix 中用新行替换每 10 个管道

在 unix 中用新行替换每 10 个管道

假设我有字段:

name, number, id

我有一个数据文件:

name1|number1|id1|name2|number2|id2...etc

我想用新行或“\n”替换每个第三根管道,因此我得到:

name1|number1|id1  
name2|number2|id2  

我对 awk 或 sed 不太满意。

我尝试过以下方法及其变体:

awk '/"\|"/{c++;if(c==10){sub("\|","\n");c=0}}1' inputfile.txt  
sed 's/"|"/"\n"/2' inputfile.txt  

它告诉我 awk:

第 1 行附近语法错误

awk:第 1 行附近的非法语句

awk:第 1 行附近有语法错误

awk:在第 1 行附近退出

任何帮助是极大的赞赏!

编辑:谢谢!

答案1

例如,你可以使用这个:

$ awk -v RS="|" '{printf $0 (NR%3?RS:"\n")}' file
name1|number1|id1
name2|number2|id2..

解释

  • -v RS="|"将记录分隔符设置为|
  • printf $0 (NR%3?RS:"\n")如果记录数是 3 的倍数,则用新行打印整行。

答案2

纯粹的bash答案。不如awk解决方案那么优雅,但可能会派上用场:

i=3; IFS='|'; while read -a line; do echo "${line[*]:0:$i}"; echo "${line[*]:$i}"; done < inputfile.txt

解释:

  • i=3将其设置为每行所需的字段数。
  • IFS='|'将分隔符设置为管道。
  • while read -a line将输入文件中的每一行读入 bash 数组。
  • echo "${line[*]:0:$i}"$i在一行上打印数组的第一个值。
  • echo "${line[*]:$i}"将数组的其余部分打印在一行上。

相关内容