Как объединить первые 12 столбцов? - PullRequest
1 голос
/ 13 мая 2019

У меня есть текстовый файл, который содержит текст вроде:

Somename of someone                                   1234 7894
Even some more name                                   2345 5343
Even more of the same                                 6572 6456
I am a customer                                       1324 7894
I am another customer                                 5612 3657
Also I am a customer and I am number Three            9631 7411
And I am number four and not the latest one in list   8529 9369
And here I am                                         4567 9876

Мне нужно сделать файл CSV из этого, но проблема в том, что имя содержит 12 столбцов, поэтому мне нужно объединить все из первых 12 столбцов в 1 столбец, чтобы файл CSV выглядел следующим образом:

Somename of someone,123456,789456
cut -d ' ' -f1-11  test | sed "s/[[:space:]]/\\ /g" | sed "s/\t/\\ /g" > test1

дает мне файл с первыми 12 столбцами.

Ответы [ 5 ]

2 голосов
/ 13 мая 2019

С GNU sed для сокращения \ s / \ S для пробела / не пробела и -E для включения ERE:

$ sed -E 's/\s+(\S+)\s+(\S+)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876

и функциональный эквивалент с любым POSIX sed:

$ sed 's/[[:space:]]*\([^[:space:]]\{1,\}\)[[:space:]]*\([^[:space:]]\{1,\}\)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876

или с любым awk:

$ awk -v OFS=',' '{x=$(NF-1) OFS $NF; sub(/([[:space:]]+[^[:space:]]+){2}$/,""); print $0, x}' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
1 голос
/ 13 мая 2019

Если различные столбцы, связанные с именем, являются частью одного и того же столбца CSV и поэтому должны оставаться без изменений, почему бы не работать только с двумя последними столбцами?

$ sed 's/\t* *\([0-9]\+\)\t* *\([0-9]\+\)$/,\1,\2/' input_file
Somename of someone,123456,789456
Even some more name,234567,534312
Even more of the same,657212,645613
1 голос
/ 13 мая 2019

Если вы не возражаете против использования GNU AWK, вы можете сделать это:

gawk 'BEGIN {FIELDWIDTHS = "54 5 5"; OFS = ","} {print $1, $2, $3}' FILE

Дальнейшее объяснение:

  • У вас действительно есть 3 столбца данных фиксированной ширины, таким образом FIELDWIDTHS = "54 5 5"
  • Вы хотите, чтобы разделитель выходного поля был запятой, таким образом OFS = ","

Обратите внимание, что FIELDWIDTHS является функцией GNU AWK.

Если вы не возражаете против сохранения пробелов в нашем CSV, то все готово.

Или, если вам также нужно удалить пробел, то:

# test.gawk

BEGIN {
  FIELDWIDTHS = "54 5 5"
  OFS = ","
}
{
  for (f=1; f<=NF; f++) {
    sub(/ +$/, "", $f)   # Delete whitespace.
  }
  print
}

Тестирование:

▶ gawk -f test.gawk FILE
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876

(Обратите внимание, что во второй версии, как предложил Эд Мортон в комментариях, я смог просто использовать print в конце, потому что мы изменили поля, которые эффективно обновляют $0, а разделители полей заменены на OFS.)

0 голосов
/ 13 мая 2019

a hacky awk

$ awk '{last="," $(NF-1) "," $NF; NF-=2; print $0 last}' file 

Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876

захватить два последних столбца, уменьшить количество столбцов, что также нормализует интервал;затем напечатайте.

0 голосов
/ 13 мая 2019

Можете ли вы объяснить, являются ли первые столбцы именем и сколько столбцов имен являются их максимальными, перед цифрами?Зная это, можно относительно легко добавлять запятые и сохранять в .csv.

tr -s '[:blank:]' ','
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...