Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 查找文本文件中只有空格的列,并用唯一分隔符替换它们_Regex_R_Bash_Awk_Sed - Fatal编程技术网

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但是标点符号!它已经不存在了:(是的,我想知道有多少人会经常接受注释脚本,并认为他们会通过添加标点符号来“修复”它:-)。