Как удалить все после второго двоеточия во втором столбце и сохранить все остальное?

ProxySampler — это CLI-инструмент golang для тестирования списков прокси:https://github.com/packetstream/proxysampler

proxysampler --output json --file./proxies.txt --endpoint https://ifconfig.co/json --include-response-body

{
  "success": 3,
  "fail": 0,
  "average_ttfb": 693,
  "results": [
    {
      "proxy": "https://proxyuser:proxypass_country-US@proxy.packetstream.io:31111",
      "endpoint": "https://ifconfig.co/json",
      "status_code": 200,
            "response_body": "{\"ip\":\"47.149.139.253\",\"ip_decimal\":798329853,\"country\":\"United States\",\"country_eu\":false,\"country_iso\":\"US\",\"city\":\"Torrance\",\"latitude\":33.846,\"longitude\":-118.3456,\"asn\":\"AS5650\",\"asn_org\":\"Frontier Communications of America, Inc.\"}",
      "latency": {
        "ttfb": 552,
        "connect": 29,
        "tls_handshake": 141
      },
      "error": null
    },
    {
      "proxy": "https://proxyuser:proxypass_country-US@proxy.packetstream.io:31111",
      "endpoint": "https://ifconfig.co/json",
      "status_code": 200,
      "response_body": "{\"ip\":\"63.237.69.254\",\"ip_decimal\":1072514558,\"country\":\"United States\",\"country_eu\":false,\"country_iso\":\"US\",\"city\":\"Walkersville\",\"hostname\":\"ssl.clarkconstruction.com\",\"latitude\":39.4787,\"longitude\":-77.3484,\"asn\":\"AS16431\",\"asn_org\":\"The Clark Construction Group, Inc.\"}",
      "latency": {
        "ttfb": 534,
        "connect": 28,
        "tls_handshake": 114
      },
      "error": null
    },
    {
      "proxy": "https://proxyuser:proxypass_country-US@proxy.packetstream.io:31111",
      "endpoint": "https://ifconfig.co/json",
      "status_code": 200,
      "response_body": "{\"ip\":\"24.167.234.46\",\"ip_decimal\":413657646,\"country\":\"United States\",\"country_eu\":false,\"country_iso\":\"US\",\"city\":\"Milwaukee\",\"hostname\":\"cpe-24-167-234-46.wi.res.rr.com\",\"latitude\":43.1166,\"longitude\":-87.9904,\"asn\":\"AS10796\",\"asn_org\":\"Charter Communications Inc\"}",
      "latency": {
        "ttfb": 993,
        "connect": 27,
        "tls_handshake": 272
      },
      "error": null
    }
  ]
}

1
19.11.2020, 13:34
6 ответов

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

awk '{sub(/:[^:]*:[^:]*$/,"",$2)}1' file.bim > updated_file.bim

или

awk '{sub(/(:[^:]*){2}$/,"",$2)}1' file.bim > updated_file.bim

Это будет использовать функцию sub()для редактирования второго столбца($2)путем замены двух последних :и текста, следующего за ними, на «ничего», таким образом эффективно удаляя эту часть.

Если выходной файл должен быть разделен табуляцией -, используйте awk -v OFS="\t" '... '.

В качестве альтернативы , если ваш файл разделен группами из более чем одного «пробела» и вы хотите убедиться, что форматирование разделителя полностью не изменилось, вы можете использовать

awk '{sub(/:[^:]*:[^: ]* /," ")}1' file.bim > updated_file.bim

, который будет искать шаблон «:, за которым следует текст, за которым следует :, за которым следует текст, за которым следует пробел», и заменяет его одним «пробелом». В вашем вводе этот шаблон встречается только в конце столбца 2, поэтому замена повлияет только на этот столбец.

Наконец, , если когда-либо в будущем количество:-разделенных полей во втором столбце может измениться, но вы все равно хотите сохранить только первые два, вы можете прибегнуть к моему оригиналу хотя и менее переносимый вариант, который заменяет 2-й столбец только текстом вокруг первого:(вместо текста за двумя последними словами «ничего»):

awk '{$2=gensub(/([^:]+:[^:]+).*/,"\\1","1",$2)}1' file.bim > updated_file.bim
2
18.03.2021, 22:48

Используйте sed, чтобы заменить все пустые места на " :", затем удалите поля $6 и $7 и поместите содержимое $4 и 5 долларов на 5 долларов с awk:

sed  's/ /:/g' bim | awk  -F':' '{ $6=""; $7="" ; $4=$4$5; $5="" }1' > updated_file.bim 

БЕЗ СЭД:

awk  '{ gsub(/ /,":",$0); FS=":";$6=""; $7="" ; $4=$4$5; $5="" }1' bim > updated_file.bim 
0
18.03.2021, 22:48

Удалить все после второго двоеточия во втором столбце и оставить все остальное:

awk '{ c=split($2, s, ":"); $2=s[1] (c>1?":":"") s[2]; }1' infile

как вы заметили, это удаляет повторяющиеся пробелы, когда мы повторно -оцениваем второй столбец, если это не является большой проблемой с вашей стороны; иначе используйте ниже sedв качестве альтернативы:

sed -E 's/^([^ ]* *)([^: ]*:[^: ]*):[^ ]* (.*)/\1\2 \3/' infile

тест -дата;

::1   1:81995:9:C:T    0   8::199:59  T   C
1:a:  :1821249GA:    0   821:2:4  A   G
111   1:828539::    0   :::828539  T   A

результат:

::1   1:81995    0   8::199:59  T   C
1:a:  :1821249GA    0   821:2:4  A   G
111   1:828539    0   :::828539  T   A
2
18.03.2021, 22:48

с awkсначала с substr($2, 1, 8)вы выбираете из 2 долларов то, что вам нужно. И выведите значение sвместо $2. Таким образом, ваш код с этим может быть:

awk 's = substr($2, 1, 8) {print $1, s, $3, $4, $5, $6}' file
1 1:819959 0 819959 T C
1 1:821249 0 821249 A G
1 1:821477 0 821477 G A
1 1:821843 0 821843 T C
1 1:823963 0 823963 C A
1 1:824357 0 824357 T C
1 1:824398 0 824398 C A
1 1:827972 0 827972 A G
1 1:828539 0 828539 T A

Обновлено для сохранения пробелов:

awk -F '[[:blank:]]{2,}' '$2 = substr($2, 1, 8) {print $1, $2, $3, $4, $5, $6}' file | column -t
1  1:819959  0  819959  T  C
1  1:821249  0  821249  A  G
1  1:821477  0  821477  G  A
1  1:821843  0  821843  T  C
1  1:823963  0  823963  C  A
1  1:824357  0  824357  T  C
1  1:824398  0  824398  C  A
1  1:827972  0  827972  A  G
1  1:828539  0  828539  T  A
0
18.03.2021, 22:48

Следующие выходные данные могут быть получены с помощью команды sed

cat file.bim | sed 's/:[a-zA-Z]//g' >> updated_file.bim

or

cat file.bim | sed 's/:[[:alpha:]]//g' >> updated_file.bim

Выход:

1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A
0
18.03.2021, 22:48

С GNU sed для\S:

$ sed 's/\(:[^:]*\)\S*/\1/' file
1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A

или с любым POSIX-кодом:

$ sed 's/\(:[^:]*\)[^[:space:]]*/\1/' file
1   1:819959    0   819959  T   C
1   1:821249    0   821249  A   G
1   1:821477    0   821477  G   A
1   1:821843    0   821843  T   C
1   1:823963    0   823963  C   A
1   1:824357    0   824357  T   C
1   1:824398    0   824398  C   A
1   1:827972    0   827972  A   G
1   1:828539    0   828539  T   A
1
18.03.2021, 22:48

Теги

Похожие вопросы