Regex 查找文本文件中只有空格的列,并用唯一分隔符替换它们
我有这样一个文件:Regex 查找文本文件中只有空格的列,并用唯一分隔符替换它们,regex,r,bash,awk,sed,Regex,R,Bash,Awk,Sed,我有这样一个文件: aaa b b ccc 345 ddd fgt f u 3456 e r der der 5 674 正如您所见,分隔列的唯一方法是查找只有一个或多个空格的列。我们如何识别这些列,并将它们替换为唯一的分隔符,如, aaa,b b,ccc,345 ddd,fgt,f u,3456 e r,der,der,5 674 注: 如果我们找到所有带有一个或多个空格(没有其他空格)的连续列,并将它们替换为,(所有列),问题将得到解决 josifos
aaa b b ccc 345
ddd fgt f u 3456
e r der der 5 674
正如您所见,分隔列的唯一方法是查找只有一个或多个空格的列。我们如何识别这些列,并将它们替换为唯一的分隔符,如,
aaa,b b,ccc,345
ddd,fgt,f u,3456
e r,der,der,5 674
注:如果我们找到所有带有一个或多个空格(没有其他空格)的连续列,并将它们替换为
,
(所有列),问题将得到解决
josifoski更好地解释了这个问题:
对于每个矩阵字符块,如果所有字符都是“空格”,则所有字符块应垂直替换为每行一个。$cat tst.awk
$ cat tst.awk
BEGIN{ FS=OFS=""; ARGV[ARGC]=ARGV[ARGC-1]; ARGC++ }
NR==FNR {
for (i=1;i<=NF;i++) {
if ($i == " ") {
space[i]
}
else {
nonSpace[i]
}
}
next
}
FNR==1 {
for (i in nonSpace) {
delete space[i]
}
}
{
for (i in space) {
$i = ","
}
gsub(/,+/,",")
print
}
$ awk -f tst.awk file
aaa,b b,ccc,345
ddd,fgt,f u,3456
e r,der,der,5 674
开始{FS=OFS=“”;ARGV[ARGC]=ARGV[ARGC-1];ARGC++}
NR==FNR{
对于(i=1;iawk中的另一个
awk 'BEGIN{OFS=FS=""} # Sets field separator to nothing so each character is a field
FNR==NR{for(i=1;i<=NF;i++)a[i]+=$i!=" ";next} #Increments array with key as character
#position based on whether a space is in that position.
#Skips all further commands for first file.
{ # In second file(same file but second time)
for(i=1;i<=NF;i++) #Loops through fields
if(!a[i]){ #If field is set
$i="," #Change field to ","
x=i #Set x to field number
while(!a[++x]){ # Whilst incrementing x and it is not set
$x="" # Change field to nothing
i=x # Set i to x so it doesnt do those fields again
}
}
}1' test{,} #PRint and use the same file twice
awk'BEGIN{OFS=FS=”“}#将字段分隔符设置为空,因此每个字符都是一个字段
FNR==NR{for(i=1;i由于您也对其进行了标记,这里有一个可能的解决方案,使用R
包readr
。看起来您希望读取固定宽度文件并将其转换为逗号分隔的文件。您可以使用read_fwf
读取固定宽度文件,并使用write_csv
写入逗号分隔的文件
# required package
require(readr)
# read data
df <- read_fwf(path_to_input, fwf_empty(path_to_input))
# write data
write_csv(df, path = path_to_output, col_names = FALSE)
#必需的软件包
需要(readr)
#读取数据
df什么定义了一列?它们都是3个字符长吗?是不是在f
和u
之间有一个空格,而fgt
和f
之间有不止一个空格?为什么b
是一列?哦,对了,所以我们只需要找到用空格分隔的列,其中有空格,以确定ine哪些列包含空格。@josifoski在python中没有可以在awk中完成的文本操作。事实上,我们看到编写python脚本的人提出了许多问题,询问如何调用awk来操作python脚本中的文本,但决不能相反。speedy!需要解释请随时提供解释:-)。我认为它非常简单明了,可能有几处参考了新手手册页,所以我宁愿OP思考一下,如果有问题的话也可以提问。@EdMorton我认为这至少值得一点解释。这部分ARGV[ARGC]=ARGV[ARGC-1];ARGC++
对于新手来说,即使他们阅读了手册页,也肯定会感到困惑。我想你忘了当你不熟悉该语言时,遵循程序逻辑是多么困难。我宁愿回答问题,也不必解释每一行可能令人困惑的内容。在谷歌和手册页之间,我想E efforce可以回答任何问题,但我很乐意回答任何在付出一点点努力后仍无法理解的问题。@EdMorton但是标点符号!它已经不存在了:(是的,我想知道有多少人会经常接受注释脚本,并认为他们会通过添加标点符号来“修复”它:-)。