Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Shell 价值观与条件的交换?_Shell_Awk_Conditional Statements - Fatal编程技术网

Shell 价值观与条件的交换?

Shell 价值观与条件的交换?,shell,awk,conditional-statements,Shell,Awk,Conditional Statements,我有一个以下文件,我想交换以下格式的值:数字(最多3位)@数字(最多4位),后跟#或空格/行尾。 如果@后跟非数字,则不应交换它们 样本输入 样本输出: 尝试了以下逻辑,似乎需要拆分才能交换值,但无法检查条件以及如何将其保存在同一字段中 awk '{for(a=1;a<=NF;a++){if($a~/@/){split($a,b,"[@#]");val1=b[1];val2=b[2];print val1,val2}}}' file1 123 456 123 456

我有一个以下文件,我想交换以下格式的值:数字(最多3位)@数字(最多4位),后跟#或空格/行尾。 如果@后跟非数字,则不应交换它们

样本输入 样本输出:


尝试了以下逻辑,似乎需要拆分才能交换值,但无法检查条件以及如何将其保存在同一字段中

awk '{for(a=1;a<=NF;a++){if($a~/@/){split($a,b,"[@#]");val1=b[1];val2=b[2];print val1,val2}}}' file1
123 456
123 456

awk'{for(a=1;a对于所显示的示例,您可以尝试以下内容。使用GNU
awk编写并测试

awk -v RS='([0-9]{1,3}@[0-9]{1,4}#)+[0-9]{1,3}@[0-9]{1,4}' '
{
  val=""
  delete arr
  delete arr2
  num=split(RT,arr,"#")
  for(i=1;i<=num;i++){
    valTemp=""
    split(arr[i],arr2,"@")
    valTemp=arr2[2]"@"arr2[1]
    val=(val?val "#":"")valTemp
  }
  ORS=val
}
1
'  Input_file
awk-vrs='([0-9]{1,3}@[0-9]{1,4}#)+[0-9]{1,3}@[0-9]{1,4}”
{
val=“”
删除arr
删除arr2
num=拆分(RT,arr,“#”)

对于(i=1;i这个简单的
gnu sed
应该能够完成这项工作:


sed-E的/\使用GNU
sed
用于:

输入:

xyz123@456#1@34#1234@2 
0123@456# 123@456# 
123@456#1@34#123@212#3@456#1@34#123@2#123@xyzx
5678@124  111@110# 002@001 01@010 1111@000 
1111@000
输出:

xyz123@456#34@1#1234@2 
0123@456# 456@123# 
456@123#34@1#212@123#456@3#34@1#2@123#123@xyzx
5678@124  110@111# 001@002 010@01 1111@000 
1111@000

这将改变
1234@5678
虽然它不是数字{1,3}@digits{1,4};以及
xyz123@456
并且不会改变
023@456#
@Bajajsahab,你能不能在这里确认一下,你是在寻找数字的数量,就像任何数字在计数时可能出现在1到4之间,而不是1到4之间?请确认一下。@aғsιη,好的,我现在回来了。这就是为什么我总是在我的答案中写一个swer仅根据显示的样本,否则将有很多假设,我们不知道什么是正确的,什么是不正确的:)我不认为
000@1111
应更改为
111@000
(可能只要求检查条件,但我相信这些条件不适用于预期输出),这不是OP的输出样本中显示的内容,我将等待OP确认这一点,谢谢。我对
000@1111
它应该改变,但是
1111@000
不应(根据OP在“
数字(最多3位)@数字(最多4位)
中所说的内容),但让我们/他确认一下;但是你的
RS
应该是
RS='([0-9]{1,3}@[0-9]{1,4}})+[0-9]{1,3}@[0-9]{1,4}
;在某些情况下,你还可以添加额外的@,比如
110@111#
更改为
111@110#@
@aғsιη,行
1111@000#bla@blabla
我测试了我的代码,但代码没有改变:)所以根据OP,cheers提到的样本和条件,regex工作正常。
sed -E 's/\b([[:digit:]]{1,3})@([[:digit:]]{1,4})(#|[[:blank:]]*|[[:blank:]]*$)/\2@\1\3/g' infile
xyz123@456#1@34#1234@2 
0123@456# 123@456# 
123@456#1@34#123@212#3@456#1@34#123@2#123@xyzx
5678@124  111@110# 002@001 01@010 1111@000 
1111@000
xyz123@456#34@1#1234@2 
0123@456# 456@123# 
456@123#34@1#212@123#456@3#34@1#2@123#123@xyzx
5678@124  110@111# 001@002 010@01 1111@000 
1111@000