Используйте SED или AWK для перемещения строки в новый столбец и строку

У меня есть. CSV-файл с разделителем табуляции, и мне нужно переместить информацию строки заголовка в «новый» столбец в начале и указанное количество строк вниз. Я хотел бы использовать стандартные инструменты, которые я сейчас использую, например sed или awk но если другой инструмент / метод более уместен, я бы приветствовал это предложение. Заголовок изменяется на файл, поэтому мне нужно скопировать его, а не просто поместить строку «CAT» в соответствующую строку и столбец.

  CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

Станет:

  CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

5 Solutions collect form web for “Используйте SED или AWK для перемещения строки в новый столбец и строку”

paste также может сделать это:

отредактированный

Это снова печатает первую строку. Воспользовавшись отсутствием кавычек, конечные пробелы не отображаются:

 $ paste -d"\t" <(printf "\n\n\n%s" $(head -1 file)) file CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

оригинал

 $ -d"\t" <(printf "\n\n\nCAT") file CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

Для меня работает следующая команда sed:

 sed '1!s/^/\t/;4s/^/CAT/' 

Интерпретация:

На линиях, отличных от номера 1, замените начало строки на вкладку. На четвертой строке замените начало строки на строку CAT.

Вы можете использовать sed следующим образом:

  1. сохранить первую строку в пространстве hold
  2. добавьте дополнительную вкладку (столбец) из строки # 2 вперед (это сохраняет исходное выравнивание столбца заголовка)
  3. в указанной следующей строке (я использовал строку # 4 в примере ниже), поменяйте место hold в пространстве pattern , отрисуйте пробел от него и добавьте его в строку

 $ sed -e '1h' -e '2,$s/^/\t/' -e '4{x;s/[[:space:]]//g;G;s/\n//}' file CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

Вы также можете попробовать эту команду awk.

 $ awk 'NR==1{var=$1} {sub (/^ /," ");} NR==4{ sub (/^ +/,""); $0=" "var" "$0}1' file CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG CAT DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG DOG 

Он извлекает строку в первой строке, а затем добавляет ту же строку в начале строки 4.

Использование awk :

 awk -v line=4 -F '^\t*|\t+' ' NR==1 { OFS="\t"; ins=$2 } NR!=line { print "","",$0 } NR==line { print "",ins,$0 }' file 

Это будет использовать первое непустое поле строки заголовка в качестве текста для вставки, поэтому он может иметь любой текст отдельно от закладки или новой строки. Разделитель полей настроен таким образом, что это всегда считывается как второе поле в awk .

  • Найти совпадения на смежных линиях
  • Разбор нескольких разделов данных в отдельные файлы
  • Заменить только в определенной строке диапазона
  • извлекать символы before () с помощью grep
  • Поиск и замена пути стиля Windows с помощью sed
  • Отфильтруйте файл .CSV на основе 5-го значения столбца файла и распечатайте эти записи в новый файл
  • Строки соответствия, начинающиеся с одного шаблона в двух текстовых файлах
  • Я хочу сконденсировать список диапазонов (от-до)
  • Условный awk через 4 столбца
  • Перепишите команду find, которая использует sed -i для AIX
  • Фильтрация журнала на последней букве в строке
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.