查找重复的列并将它们分离到文件或变量(Bash)

查找重复的列并将它们分离到文件或变量(Bash)

我有类似的输出;(各列由制表符分隔\t

name1   something1
name1   something2
name1   something3
name2   something4
name2   something5

对于这个输出,我需要两个输出(如果有name3,我将需要 3 个输出),例如

name1   something1
name1   something2
name1   something3

name2   something4
name2   something5

我认为这可以由 AWK 完成,但我无法创建神奇的词语。

做这个的最好方式是什么?

我需要一个条件来读取$1“1.column”并打印所有这些(不删除重复项),除非它会改变并打印其他列($2、$3、...)

我认为使用循环它会打印第一个输出等等。

答案1

尝试这个:

awk -F'\t' '{print>$1;}' file

当上述命令执行完成后,目录中会多出两个文件:

$ cat name1
name1   something1
name1   something2
name1   something3
$ cat name2
name2   something4
name2   something5

怎么运行的

  • -F'\t'

    这告诉 awk 使用制表符作为字段分隔符。

  • print>$1

    这告诉 awk 将每一行打印到以第一个字段命名的文件中。

从文件名中删除非法字符

假设输入文件如下:

$ cat file
name/1  something1
name/1  something2
name/1  something3
name/2  something4
name/2  something5

以下代码根据名称字段创建文件,但删除/了:

awk -F'\t' '{name=$1; gsub(/[/]/, "", name); print>name;}' file

以上内容已在 GNU awk 上测试并成功运行。如果您的 awk 不接受,请尝试:

awk -F'\t' '{name=$1; gsub("/", "", name); print>name;}' file

或者:

awk -F'\t' '{name=$1; gsub(/\//, "", name); print>name;}' file

答案2

我认为这应该可行:

mkdir tmp; cd tmp
while IFS= read line; do
    echo "$line" >> $(echo "$line" | awk '{print $1}')
done
cat *

这将逐行读取输入并将每行附加到其第一个参数。

如果您想将其流式传输到变量:

while IFS= read line; do
    key="$(echo "$line" | awk '{print $1}')"
    eval "INPUT_$key='\$INPUT_$key\$line'"
done

如果您对它有很大的要求,请使用:

#!/usr/bin/python

import sys
import re

for line in sys.stdin:
    f = open(re.split("\s+", line, 1), 'a')
    f.write(line)
    f.close()

这会成功的。一定成功。不会失败的。

相关内容