假设我有字段:
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}"
将数组的其余部分打印在一行上。