簡體   English   中英

匹配文件的第一列與awk,引號有困難

[英]Matching first column of file with awk, difficulty with quotes

我的輸入文件如下所示

Chr1 1
Chr1 2
Chr2 3

我想根據第一列中的Chr將輸入文件拆分為多個文件。

應該有兩個輸出文件輸出文件1(名為tmpChr1):

Chr1 1
Chr1 2

輸出文件2(名為tmpChr2):

Chr2 3

這是迄今為止的代碼:

#!/bin/bash

for((chrom=1;chrom<30;chrom++)); do
echo Chr${chrom}
chr=Chr${chrom}
awk "\$1==$chr{print \$1}" input.txt > tmp$chr
done

awk "\\$1==$chr{print \\$1}"是問題,awk似乎需要在$ chr附近引用以正確匹配$ 1

awk '$1=="Chr1"{print $1}'工作,tmpChr1成立

awk '$1=="$chr"{print $1}'也不起作用

並沒有awk "$1=='$chr'{print $1}"

真的在報價上掙扎,有人能說清楚我應該做些什么嗎?

永遠不要在awk腳本周圍使用雙引號,並且絕不允許shell變量作為awk腳本主體的一部分進行擴展。 請參閱http://cfajohnson.com/shell/cus-faq-2.html#Q24

盡管如此,你仍然可以通過一般方法取消標記。 你只需要這個awk腳本:

awk '{print > ("tmp"$1)}' file

看:

$ ls
file
$ cat file
Chr1 1
Chr1 2
Chr2 3
$ awk '{print > ("tmp"$1)}' file
$ ls
file  tmpChr1  tmpChr2
$ cat tmpChr1
Chr1 1
Chr1 2
$ cat tmpChr2
Chr2 3

無論何時在shell中編寫循環只是為了操作文本,你都有錯誤的方法。 UNIX shell是一種環境,可以使用該語言調用工具來對這些調用進行排序。 用於操作文本的UNIX工具是awk。 因此,如果您需要在UNIX中操作文本,請編寫一個awk腳本並從shell調用它,這就是全部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM