1

Допустим, у меня есть поля:

name, number, id

У меня есть файл данных:

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

Я хочу заменить каждый 3-й канал новой строкой или '\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

Любая помощь очень ценится!

РЕДАКТИРОВАТЬ: Спасибо!

2 ответа2

3

Вы можете, например, использовать это:

$ 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.
1

Чистый ответ 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}" Вывести остаток массива на строку.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .