Использование awk для отображения текста вместо открытия файла - PullRequest
0 голосов
/ 21 марта 2019

У меня есть список имен файлов - имитируется

f="HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam  HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam"

Я бы хотел, чтобы моя операция выбрала текст "HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam" и обработал его до "HDAC3_CTRL_Diff-D0_A"

Я пытаюсь

echo $f | awk '/_A/ { echo }' | sed 's/.dedup.sorted.bam//g' 

но я застреваю в самом начале

awk '/_A/ { echo }' $f 

выдает ошибку

awk: fatal: cannot open file `HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam' for reading (No such file or directory)

Я не хочу, чтобы он открывал какой-либо файл. Я просто хотел бы проанализировать список для получения усеченной строки.

Ответы [ 3 ]

0 голосов
/ 21 марта 2019

Я не уверен, что * * * * * * * * * * * * * * * * * * * * * * * * * * * $1 * * * * * * * * * * * *

*1004* *

Ошибка при открытии файлов:потому что вы передали $f в awk в командной строке, а не передавали содержимое переменной в awk.Аргументы командной строки для awk считаются именами файлов.Вы могли бы поместить свое фактическое имя файла туда, но не эту переменную $f (которая, как я предполагаю, содержит пример содержимого входного файла, а не имена входных файлов).

0 голосов
/ 22 марта 2019

Это то, что вы пытаетесь сделать (используя GNU awk для RS с несколькими символами)?

$ echo "$f" | awk -v RS='\\s+' 'sub(/_A\.dedup\.sorted\.bam$/,"_A")'
HDAC3_CTRL_Diff-D0_A
0 голосов
/ 21 марта 2019

1-е решение: В awk это не работает, как BASH, у нас есть отдельная print функция для него echo не будет работать в нем.Вы можете попробовать выполнить следующее (это удалит все от . до последней строки для всех частей переданной переменной.

echo "$f" | awk '{for(i=1;i<=NF;i++){sub(/\..*/,"",$i);print $i}}'
HDAC3_CTRL_Diff-D0_A
HDAC3_CTRL_Diff-D0_B


2-е решение ВЕсли вы хотите найти конкретную строку и удалить из нее некоторые части, попробуйте следующее:

echo "$f"  | awk 'match($0,/HDAC3[^ ]*/){val=substr($0,RSTART,RLENGTH);sub(/\..*/,"",val);print val}'
HDAC3_CTRL_Diff-D0_A

ИЛИ (форма решения не с одним вкладышем):

f="HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam  HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam"
echo "$f"  | 
awk '
   match($0,/HDAC3[^ ]*/){
      val=substr($0,RSTART,RLENGTH)
      sub(/\..*/,"",val)
      print val
   }
'

3-е решение: Если кто-то захочет найти точную строку, попробуйте выполнить следующее.

echo "$f"  | awk 'match($0,/HDAC3_CTRL_Diff-D[0-9]+_A/){print substr($0,RSTART,RLENGTH)}'


4-е решение: В случае, если в строках разных полей может быть несколько вхождений _A, попробуйте выполнить следующее.

Предполагая, что ваша переменная f имеет следующие значения.

echo "$f"
HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam  HDAC3_CTRL_Diff-D0_B.dedup.sorted.bam  HDAC3_CTRL_Diff-D01_A.dedup.sorted.bam

Теперь, когда мы запускаем новый код:

echo "$f" | awk '{for(i=1;i<=NF;i++){if($i ~ /HDAC3_CTRL_Diff-D[0-9]+_A/){print $i}}}' 
HDAC3_CTRL_Diff-D0_A.dedup.sorted.bam
HDAC3_CTRL_Diff-D01_A.dedup.sorted.bam


Проблемыобнаружена в попытке ОП:

  • awk не имеет функции echo, вместо нее используется `print.
  • awk когдаты пытаешьсяo передать, как awk......$f, это означает, что вы передаете ему файл Input_file, что НЕ в данном случае, поэтому вы не должны этого делать.
  • Если это текст, который вы хотите передать awk, изатем попробуйте либо echo "text here...." | awk code here. ИЛИ awk ..... <<<"$var" для примера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...