Как awk печатать, используя значения индекса из одного файла, извлекая данные из второго файла и сохраняя вывод в третий файл?

Вы можете установить его командой rpm:

rpm -i https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/n/ntfs-3g-2017.3.23-11.el7.x86_64.rpm

Можно попробовать установить только yumиз rpm тем же способом:

rpm -i http://your_centos_mirror/7/os/x86_64/Packages/yum-3.4.3-161.el7.centos.noarch.rpm
0
24.01.2021, 18:05
3 ответа

awk может справиться с этим самостоятельно :это файл "combine.awk"

# first file, first line
FILENAME == ARGV[1] && FNR == 1  {
    for (i=5; i<=NF; i++) head[i] = $i
}

# first file,  subsequent lines
FILENAME == ARGV[1] && FNR > 1 {
    for (i=5; i<=NF; i++) {
        split($i, f, /:/)
        value[$2, head[i]] = f[3]
    }
}

# second file
FILENAME == ARGV[2] {
    print $0, (FNR == 1 ? "Output" : value[$3, $1])
}

И затем вы вызываете его вот так

awk -f combine.awk file2 file1 > file3

Выходной файл содержит

SampleName   Type     Position Output
5R01924      ABC      92184093 R
5R01028      ABC      15589809 J
5R01092      ABC      48759348 AL
1
18.03.2021, 22:35

Нет необходимости вызывать bash для чтения файлов.

Все это можно сделать внутри awk, как показано здесь:

### sanitize inputs
for f in./File1./File2; do
  dos2unix "$f"
done

awk '
  !NF || $1 ~ /^#/ {next}
  NR==FNR {
    for (i=5; i<=NF; i++)
      if (NR > 1) {
        split($i, t, /:/)
        a[sample[i-4],$2] = t[3]
        split("", t, ":")
      }
      else sample[i-4] = $i
    next
  }
  {
    k = $1 SUBSEP $3
    f = FNR == 1  ? "Output" \
      : !(k in a) ? "N/A"    \
      : a[k]
    print $0, f
  }
' File2 OFS="\t" File1

Выход:

SampleName   Type     Position  Output
5R01924      ABC      92184093  R
5R01028      ABC      15589809  J
5R01092      ABC      48759348  AL
0
18.03.2021, 22:35

Во-первых, ваш вопрос сложный, значит, и не стоило ожидать простого ответа.

awk 'BEGIN{IFS="[[:space:]]+";OFS=" ";} NR>1 && NR==FNR {Trr[$3]=$0;Arr[$1]=$3;next} NR>FNR && FNR==1 {for(key in Arr) {for(i=5;i<=NF;i++) {if(key==$i) {nArr[key]=i;break}}}} NR>FNR && FNR>1 {for(tKey in Trr) {if($2==tKey) {for(aKey in Arr) {if(Arr[aKey]==$2) {i=nArr[aKey];Trr[tKey]=Trr[tKey]" "$i;break}}}}}END{for(key in Trr) print Trr[key]}' A B | tr ':' ' ' | awk -F'[[:space:]]+' '{print $1,$2,$3,$6}'

пояснение к вышеизложенному:

  • IFS и OFS:входной и выходной файл (с разделителем ).
  • [[ :пробел :]]+ :поскольку разделитель файлов содержит более одного пробела, вы должны использовать его.
  • NR это номер строки начало от единицы до...
  • FNR:это это номер строки файла . если вы дадите несколько имен файлов для awk, NR перейдите от 1, но, FNR сбрасывайте на один путем изменения файла
  • следующий , разрыв свободны
  • {}:его следует использовать в каждом блоке, чтобы интерпретатор не запутался.
0
18.03.2021, 22:35

Теги

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