Shell 将选定数据移动到两个选项卡
我有一个只有一列的文件,它看起来像这样Shell 将选定数据移动到两个选项卡,shell,awk,Shell,Awk,我有一个只有一列的文件,它看起来像这样 chr1 C1orf122 YRDC chr1 chr1 chr1 chr1 NADK chr1 chr1 如果不是以chr开头,我想移动第一列中的data 2选项卡 预期产量 chr1 C1orf122 YRDC chr1 chr1 chr1 chr1 NADK chr1
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
如果不是以chr开头,我想移动第一列中的data 2选项卡
预期产量
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
我正在这样做
awk '{if($1 ~ /chr*/) print $_ ; else print "\t\t" $1}' <result >temp
awk'{if($1~/chr*/)print$\else print“\t\t”$1}”temp
数据不会移动两个选项卡:(
请帮忙
谢谢您单向使用
GNU sed
:
sed '/^chr/!s/.*/\t\t&/' file.txt
结果:
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
(那里实际上有两个选项卡)。如果您添加
-i
标志,您可以在此处进行更改,而无需使用临时文件。我对您的程序有一些注释,顺便说一句(GNU awk):
尝试在第一个字段中查找$1~/chr*/
或ch
或chr
等。如果您的意思是chr
后跟任何内容,请使用chr
,如果它应该锚定在字段的开头,请使用chr.
/^chr./
$是一个perl变量,我认为awk假设您的意思是
,即整行(记录)$0
if
开头,您可以将其放入该块的条件中,例如,以以下开头:
$1 ~ /^chr.*/ { ... }
在您的情况下,您想在行前面加上\t\t
,如果它不是以chr
开头,我会这样表示:
$1 !~ /^chr.*/ { printf("\t\t") } 1
末尾的1
打印$0
输出:
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
另一个解决方案:
awk '{$2=$1; sub($(!/chr1/),"",$1); sub($(/chr1/),"",$2); print $1 "\t\t" $2 }' file
结果:
awk '{$2=$1; sub($(!/chr1/),"",$1); sub($(/chr1/),"",$2); print $1 "\t\t" $2 }' file
chr1
C1orf122
YRDC
chr1
chr1
chr1
chr1
NADK
chr1
chr1
你能给我们一个预期输出的例子吗?我已经做了编辑,请检查它是否对我有效(我正在获得预期输出)这是否意味着我的文件中有一些隐藏字符无法正常工作?如果是,那么我如何才能看到它们以及如何消除它们?我的输入文件有问题。我无法找出原因…我假设它有一些隐藏字符或something@Angelo:sed-nl0 file.txt的结果是什么?这将显示e隐藏字符。否则,请尝试
dos2unix
。这是结果chr22\t41869347\t41869847\tMCAT$\t\t\tMCAT$原始文件有4列。因此,您可以在此处看到4列well@Angelo:因此,您的代码和我的代码至少在我的机器上都能工作。您使用的是什么shell?您的tabwidth设置为什么?请尝试键入tabs-8
若要将tabwidth重置为默认大小,请尝试使用空格而不是制表符重新创建问题。结果如何?