我有类似的输出;(各列由制表符分隔\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()
这会成功的。一定成功。不会失败的。