- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试删除几列,然后删除文件内容的唯一性。我要删除的列有月、日、时间和纪元时间;这些在每一行中都是不同的,不能让我知道文件内容的唯一性。
sample.log 的示例内容:
Jun 5 05:13:13 AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
Jun 5 05:13:14 AAA AAA AAAA 1433495594.306612 XXXX CCCC CCCC AAAA SDDDD DFFFFF222
Jun 5 05:13:13 AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
Jun 5 05:13:15 AAA AAA AAAA XXXXX 1433495596.306614 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
Jun 5 05:13:16 AAA AAA AAAA XXXXX 1433495597.306615 XXXX CCCC CCCC AAAA SDDDD DFFFFF333
Jun 5 05:13:17 AAA AAA AAAA XXXXX 1433495598.306616 XXXX CCCC CCCC AAAA SDDDD DFFFFF444
问题:
月份、日期、时间在固定列中,但是纪元时间在第 7 列和第 8 列之间切换。想知道如何处理这个问题。
示例输出:
Jun 5 05:13:13 AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
Jun 5 05:13:13 AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
Jun 5 05:13:15 AAA AAA AAAA XXXXX 1433495596.306614 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
如果上面的问题太多了,那么如下所示:
AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
AAA AAA AAAA 1433495593.306611 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
AAA AAA AAAA XXXXX 1433495596.306614 XXXX CCCC CCCC AAAA SDDDD DFFFFF111
我正在按照以下方向尝试,但不是很有帮助。
while read line
do
seven=$(echo $line |awk '{print $7}')
eight=$(echo $line |awk '{print $8}')
if [[ "$seven" =~ "^[0-9]" ]];then
#echo "seventh column starts with number"
echo $line|awk '$1=$2=$3=$7=" " {print}'
else
#echo "Eighth column starts with number"
echo $line|awk '$1=$2=$3=$8=" " {print}'
fi
done < $1
更多例子:
输入文件内容:
Jun 5 05:13:13 AAA BBB CCC 142222222222.000 DDD EEE FFFF
Jun 5 05:13:13 AAA BBB CCC 142222222223.000 DDD EEE FFFF
Jun 5 05:13:14 AAA BBB CCC 142222222224.000 DDD EEE GGGG
Jun 5 05:13:13 AAA BBB CCC XXX 142222222225.000 DDD EEE GGGG
Jun 5 05:13:13 AAA BBB CCC XXX 142222222225.000 DDD EEE FFFF
Jun 5 05:13:13 AAA BBB CCC XXX 142222222226.000 DDD EEE FFFF
输出:
Jun 5 05:13:13 AAA BBB CCC 142222222223.000 DDD EEE FFFF
Jun 5 05:13:13 AAA BBB CCC 142222222223.000 DDD EEE GGGG
Jun 5 05:13:13 AAA BBB CCC XXX 142222222225.000 DDD EEE GGGG
Jun 5 05:13:13 AAA BBB CCC XXX 142222222225.000 DDD EEE FFFF
或
输出:
AAA BBB CCC DDD EEE FFFF
AAA BBB CCC DDD EEE GGGG
AAA BBB CCC XXX DDD EEE GGGG
AAA BBB CCC XXX DDD EEE FFFF
最佳答案
如果我正确理解了这个问题,那么这里不需要 Bash,只需 Awk:
% awk '
{
for (f = 4; f <= NF; ++f) { # Start at column 4
if (f == 7 || f == 8) { # Treat columns 7 or 8 differently
if ($f !~ /^[0-9]+\.[0-9]+$/) { # Only print if non-numeric
printf $f " "
}
} else {
printf $f " "
}
}
printf "\n"
}
' sample.log
AAA AAA AAAA XXXX CCCC CCCC AAAA SDDDD DFFFFF111
AAA AAA AAAA XXXX CCCC CCCC AAAA SDDDD DFFFFF222
AAA AAA AAAA XXXX CCCC CCCC AAAA SDDDD DFFFFF111
AAA AAA AAAA XXXXX XXXX CCCC CCCC AAAA SDDDD DFFFFF111
AAA AAA AAAA XXXXX XXXX CCCC CCCC AAAA SDDDD DFFFFF333
AAA AAA AAAA XXXXX XXXX CCCC CCCC AAAA SDDDD DFFFFF444
获取唯一行:
% awk '
{
for (f = 4; f <= NF; ++f) { # Start at column 4
if (f == 7 || f == 8) { # Treat columns 7 or 8 differently
if ($f !~ /^[0-9]+\.[0-9]+$/) { # Only print if non-numeric
printf $f " "
}
} else {
printf $f " "
}
}
printf "\n"
}
' sample2.log | sort -u
AAA BBB CCC DDD EEE FFFF
AAA BBB CCC DDD EEE GGGG
AAA BBB CCC XXX DDD EEE FFFF
AAA BBB CCC XXX DDD EEE GGGG
%s
...如果您的输入文件包含 %
符号,根据您的评论,您需要在将它们传递给 printf
之前对它们进行转义。您可以使用像这样的 function
来做到这一点...
% awk '
function escape_percents(s)
{
gsub("%", "%%", s)
return s
}
{
for (f = 4; f <= NF; ++f) { # Start at column 4
if (f == 7 || f == 8) { # Treat columns 7 or 8 differently
if ($f !~ /^[0-9]+\.[0-9]+$/) { # Only print if non-numeric
printf escape_percents($f) " "
}
} else {
printf escape_percents($f) " "
}
}
printf "\n"
}
' sample2.log | sort -u
AAA BBB CCC DDD %E%E%E FFFF
AAA BBB CCC DDD %E%E%E GGGG
AAA BBB CCC XXX DDD %E%E%E FFFF
AAA BBB CCC XXX DDD %E%E%E GGGG
关于linux - 从 awk 中排除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37389686/
是否可以从 awk 文件执行另一个 awk 文件?使用 awk 文件我需要执行当前文件夹中的所有 awk 文件。是否可以在 awk 中进行此类操作? 最佳答案 是的你可以。您需要使用 system()
这是一个 awk 脚本,它尝试根据第一列设置两个文件的差异: BEGIN{ OFS=FS="\t" file = ARGV[1] while (getline < file)
awk 逐行处理文件。假设每一行操作不依赖于其他行,有没有办法让 awk 一次并行处理多行? 是否有任何其他文本处理工具可以自动利用并行性并更快地处理数据? 最佳答案 唯一试图提供 awk 并行实现的
我有文件: 结果.txt Apple fruits 10 20 30 Car vehicle 40 50 60 Book study 70 80 90 假设这里第 2 列是特征,第 3 列是最小值
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我对 awk 的行为感到惊讶表演时浮点数 计算。它导致我对表格数据进行错误计算。 $ awk 'BEGIN {print 2.3/0.1}' 23 0.1}' )。 那么我应该如何执行大于 (
为什么我在下面的例子中得到分隔符前后的空格? awk -F'^' '{print $1,":",$2}' SERVER_2012-02-29-12-15-00 3969 : 1272 3969 :
我有一个文件,其中每四行是这样的: HISEQ15:454:D27KKACXX:6:2316:16241:100283 1:N:0:GTTTCG (对于那些感兴趣的人,此文件包含DNA序列) 我需
你能帮我按 $2 列中的坐标合并行吗?有一系列坐标以一个为单位增长。我想输出 f.e. :第 1 行合并到第 4 行 9079811-9079814,之后没有系列,因此将其合并到另一行等。对于输入中的
大家好,我是 awk 的新手,我可以问一下我有这样的输入文件吗: # ABC DEFG value1 GH value2 GH value3 GH # BCF SQW value4 GH value5
大家好,我想问一下,我对awk中的括号{}感到非常困惑,就像我写了一段代码 { FNR == 3 { print $1 " age is " $2 } } 但它在外括号上给了我错误但没有在打印语
我想知道如何在 awk 中使用多行注释。到目前为止,我一直在使用 # 来评论一行。有人可以就此指导我。谢谢你。 最佳答案 AWK 中没有多行注释,但如果需要,您可以伪造它。这是一种至少适用于 GNU
关于AND逻辑运算符的一个基本问题。我试图根据第1列和第2列的值提取数据文件niveles.csv中的某些字段。我想写一个awk语句,说“当field1 = date和field2 = area然后打
以下命令按预期工作。 # some command | awk '/(\|\|\)/,/;/' create table todel1 (id int) max_rows=2 /*!*/; alter
我有一个日志文件,需要在服务器上“重播”。 它包含这样的条目: Request: query: EXEC prc_insert_customer @param0: 11
如何从制表符分隔的字符串中选择第一列? # echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{prin
我正在尝试在目录中的多个文件的内容中执行一些 grep 并将我的 grep 匹配附加到单个文件中,在我的输出中我还想要一个包含文件名的列,以了解哪些文件条目已被拾取。我试图使用 awk 来实现相同的目
我想选择文件中第9列的绝对值小于500的行。列有时为正,有时为负。 awk -F'\t' '{ if ($9 output.bam 到目前为止这不起作用..互联网上的一轮告诉我,要使用绝对值,我们应
例如,假设我运行以下命令: gawk -f AppendMapping.awk Reference.tsv TrueInput.tsv 假设文件名会改变。在遍历第一个文件时,我想创建一个映射。 map
我正在使用这个命令; awk -v regex1='new[[:blank:]]+File\(' 'BEGIN{print "Regex1 =", regex1}' 这警告我; awk: warnin
我是一名优秀的程序员,十分优秀!